Bagaimana cara mendapatkan nama kelas di PHP?

99
public class MyClass {

}

Di Java, kita bisa mendapatkan nama kelas dengan String className = MyClass.class.getSimpleName();

Bagaimana melakukan ini di PHP? Saya sudah tahu get_class(), tetapi ini hanya berfungsi untuk objek. Saat ini saya bekerja di Active Record. Saya butuh pernyataan seperti MyClass::className.

Rezan Achmad
sumber
1
Bisakah Anda memberikan contoh tertentu yang mungkin berguna di php? Jika Anda telah melakukan hardcode nama kelas - Anda dapat membungkusnya dengan tanda kutip dan mendapatkan apa yang Anda inginkan.
zerkms
2
Sayangnya refactorings otomatis (misalnya dalam IDE) seperti RenameClass biasanya tidak mengubah nama string nama kelas tersebut. Oleh karena itu, alangkah baiknya memiliki semacam cara statis untuk mendapatkan nama kelas, selain melakukan public $__CLASS__ = __CLASS__;tarian dengan setiap kelas lainnya ...
EricSchaefer

Jawaban:

114

Sejak PHP 5.5 Anda dapat menggunakan resolusi nama kelas melalui ClassName :: class .

Lihat fitur baru PHP5.5 .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

Jika Anda ingin menggunakan fitur ini dalam metode kelas Anda, gunakan static :: class :

<?php

namespace Name\Space;

class ClassName {
   /**
    * @return string
    */
   public function getNameOfClass()
   {
      return static::class;
   }
}

$obj = new ClassName();
echo $obj->getNameOfClass();

?>

Untuk versi PHP yang lebih lama , Anda dapat menggunakan get_class () .

Dado
sumber
5
Apa perbedaan antara static::classdan get_class_name()?
Alexander Jank
1
@AlexanderJank Tampaknya seolah-olah static::classdiselesaikan selama waktu kompilasi sementara get_class_name()diinterpretasikan selama runtime. Saya menemukan hal ini dengan mencoba untuk mengakses :: kelas properti dari kelas yang dihasilkan secara dinamis dan mendapatkan error berikut (?): Dynamic class names are not allowed in compile-time ::class fetch. Lihat jawaban ini untuk lebih jelasnya. Saya juga menemukan bahwa catatan dari dokumen ini bermanfaat.
cjsimon
29

Anda dapat menggunakan __CLASS__dalam kelas untuk mendapatkan nama tersebut.

http://php.net/manual/en/language.constants.predefined.php

Brad
sumber
3
Anda juga dapat melihat di sini untuk melihat semua const yang menarik: php.net/manual/en/language.constants.predefined.php
MatRt
Terima kasih kepada @Brad untuk tautannya, saya menemukan jawabannya di sini
Rezan Achmad
2
@ user1073122, Itulah link yang saya tautkan di jawaban saya.
Brad
+1 saat saya mencoba untuk mendapatkan nama kelas dengan metode yang didefinisikan di kelas induk. Solusi lain ( get_class($this), static::class) hanya mengembalikan nama kelas anak (yang memperluas induk).
akinuri
melanjutkan : self::class, juga, tampaknya untuk mengembalikan nama kelas induk.
akinuri
22

Sepertinya Anda menjawab pertanyaan Anda sendiri. get_classakan memberimu nama kelas. Itu prosedural dan mungkin itulah yang menyebabkan kebingungan. Lihat dokumentasi php untukget_class

Inilah contoh mereka:

 <?php

 class foo 
 {
     function name()
     {
         echo "My name is " , get_class($this) , "\n";
     }
 }

 // create an object
 $bar = new foo();

 // external call
 echo "Its name is " , get_class($bar) , "\n"; // It's name is foo

 // internal call
 $bar->name(); // My name is foo

Untuk membuatnya lebih seperti contoh Anda, Anda dapat melakukan sesuatu seperti:

 <?php

 class MyClass
 {
       public static function getClass()
       {
            return get_class();
       }
 }

Sekarang Anda dapat melakukan:

 $className = MyClass::getClass();

Ini agak terbatas, bagaimanapun, karena jika kelas saya diperpanjang, itu masih akan mengembalikan 'Kelas Saya'. get_called_classSebagai gantinya, kita dapat menggunakan , yang mengandalkan Late Static Binding , fitur yang relatif baru, dan membutuhkan PHP> = 5.3.

<?php

class MyClass
{
    public static function getClass()
    {
        return get_called_class();
    }

    public static function getDefiningClass()
    {
        return get_class();
    }
}

class MyExtendedClass extends MyClass {}

$className = MyClass::getClass(); // 'MyClass'
$className = MyExtendedClass::getClass(); // 'MyExtendedClass'
$className = MyExtendedClass::getDefiningClass(); // 'MyClass'
Tidak ada
sumber
Terima kasih @ J.Money untuk idenya .. Tapi itu tidak berhasil dalam warisan.
Rezan Achmad
11

Sekarang, saya punya jawaban untuk masalah saya. Terima kasih kepada Brad untuk tautannya, saya menemukan jawabannya di sini . Dan terima kasih kepada J.Money untuk idenya. Solusi saya:

<?php

class Model
{
    public static function getClassName() {
        return get_called_class();
    }
}

class Product extends Model {}

class User extends Model {}

echo Product::getClassName(); // "Product" 
echo User::getClassName(); // "User" 
Rezan Achmad
sumber
3
Itu tidak masuk akal. FooBar::getClassName()selalu 'FooBar'. Jika Anda bisa mengetik Product::getClassName()- Anda juga bisa mengetik 'Product'.
zerkms
7
Ya saya tahu .. Saya ingin menghindari kesalahan ketik dan juga saat memfaktorkan ulang nama kelas (dengan alat IDE), saya tidak perlu mencari & mengganti string.
Rezan Achmad
Ini juga bisa membantu jika Anda perlu menggunakan nama kelas dari kelas anak di kelas "Model" induk.
JR Lawhorne
8

Untuk mendapatkan nama kelas Anda bisa menggunakan ReflectionClass

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}
Omar Makled
sumber
Meskipun cuplikan kode ini dapat menjadi solusinya, menyertakan penjelasan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda.
yivi
Benar-benar Spesial !!! Ini adalah solusi SUPER tapi sederhana! Terima kasih !!!!
Simone Campagna
4

Sepertinya ReflectionClassini adalah opsi yang cukup produktif.

class MyClass {
    public function test() {
        // 'MyClass'
        return (new \ReflectionClass($this))->getShortName();
    }
}

Tolok ukur:

Method Name      Iterations    Average Time      Ops/second
--------------  ------------  --------------    -------------
testExplode   : [10,000    ] [0.0000020221710] [494,518.01547]
testSubstring : [10,000    ] [0.0000017177343] [582,162.19968]
testReflection: [10,000    ] [0.0000015984058] [625,623.34059]
Илья Зеленько
sumber
3

Menurut saya penting untuk menyebutkan sedikit perbedaan antara 'self' dan 'static' dalam PHP karena 'jawaban terbaik' menggunakan 'statis' yang dapat memberikan hasil yang membingungkan bagi sebagian orang.

<?php
class X {
    function getStatic() {
        // gets THIS class of instance of object
        // that extends class in which is definied function
        return static::class;
    }
    function getSelf() {
        // gets THIS class of class in which function is declared
        return self::class;
    }
}

class Y extends X {
}
class Z extends Y {
}

$x = new X();
$y = new Y();
$z = new Z();

echo 'X:' . $x->getStatic() . ', ' . $x->getSelf() . 
    ', Y: ' . $y->getStatic() . ', ' . $y->getSelf() . 
    ', Z: ' . $z->getStatic() . ', ' . $z->getSelf();

Hasil:

X: X, X
Y: Y, X
Z: Z, X
JerzySkalski
sumber
2

end(preg_split("#(\\\\|\\/)#", Class_Name::class))

Class_Name::class: kembalikan kelas dengan namespace. Jadi setelah anda hanya perlu membuat sebuah array, selanjutnya dapatkan nilai terakhir dari array tersebut.

CallMarl
sumber
0
<?php
namespace CMS;
class Model {
  const _class = __CLASS__;
}

echo Model::_class; // will return 'CMS\Model'

untuk versi lebih lama dari PHP 5.5

23 Bintang
sumber
0
echo substr(strrchr(__CLASS__, "\\"), 1);    
Lukas Correa
sumber