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.


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 () .


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


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'

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" 

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();
    }
}

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]

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

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.


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

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

untuk versi lebih lama dari PHP 5.5


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.