PHP'de sınıf adını nasıl alırım?


103
public class MyClass {

}

Java'da sınıf adını alabiliriz String className = MyClass.class.getSimpleName();

Bunu PHP'de nasıl yapabilirim? Zaten biliyorum get_class(), ama sadece nesneler için çalışıyor. Şu anda Active Record'da çalışıyorum. Gibi ifadeye ihtiyacım var MyClass::className.


1
Php'de yardımcı olabileceği belirli bir örnek verebilir misiniz? Sınıf adını sabit kodladıysanız - tırnak içine alabilir ve istediğinizi elde edebilirsiniz.
zerkms

2
Ne yazık ki RenameClass gibi otomatik yeniden düzenlemeler (örn. IDE'lerde) genellikle bu tür sınıf adı dizelerini yeniden adlandırmaz. Bu nedenle, public $__CLASS__ = __CLASS__;diğer tüm sınıflarla dans etmenin yanı sıra, sınıfın adını almanın bir tür statik yoluna sahip olmak güzel olurdu ...
EricSchaefer 14

Yanıtlar:


119

PHP 5.5'ten beri ClassName :: class aracılığıyla sınıf adı çözümlemesini kullanabilirsiniz .

PHP5.5'in yeni özelliklerini görün .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

Bu özelliği sınıf yönteminizde kullanmak istiyorsanız static :: class kullanın :

<?php

namespace Name\Space;

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

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

?>

PHP'nin eski sürümleri için get_class () kullanabilirsiniz .


5
Arasındaki fark nedir static::classve get_class_name()?
Alexander Jank

1
@AlexanderJank Çalışma static::classzamanı sırasında get_class_name()yorumlanırken derleme sırasında çözülmüş gibi görünüyor . (?) Ben dinamik olarak oluşturulmuş bir sınıfın :: sınıfı özelliği erişmeye çalışırken aşağıdaki hatayı alarak bu öğrendim: Dynamic class names are not allowed in compile-time ::class fetch. Daha fazla ayrıntı için bu yanıta bakın. Ayrıca dokümanlardaki bu notu yararlı buldum .
cjsimon

30

__CLASS__Adı almak için bir sınıf içinde kullanabilirsiniz .

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


3
ayrıca tüm ilginç sabitleri
MatRt

Bağlantı için @Brad'a teşekkürler, cevabı burada
Rezan Achmad

2
@ user1073122, Cevabımda bağlantı verdiğim bağlantı bu.
Brad

Üst sınıfta tanımlanan bir yöntemde sınıf adını almaya çalıştığım için +1. Diğer çözümler ( get_class($this), static::class) basitçe çocuk (ebeveyni genişleten) sınıf adını döndürür.
akinuri

devam : self::classayrıca, ana sınıf adını döndürüyor gibi görünüyor.
akinuri

23

Kendi sorunuzu cevaplamışsınız gibi görünüyor. get_classsize sınıf adını verecektir. Prosedüreldir ve belki de kafa karışıklığına neden olan budur. Php belgelerine bir göz atınget_class

İşte örnekleri:

 <?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

Örneğinize daha çok benzemek için aşağıdaki gibi bir şey yapabilirsiniz:

 <?php

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

Şimdi şunları yapabilirsiniz:

 $className = MyClass::getClass();

Bununla birlikte, bu biraz sınırlıdır, çünkü sınıfım uzatılırsa yine de 'Sınıfım' döndürür. Biz kullanabilirsiniz get_called_classdayanır, hangi yerine Bağlama Geç Statik , nispeten yeni bir özellik ve PHP> = 5.3 gerektirir.

<?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'

Fikir için teşekkürler @ J.Money .. Ama kalıtımda işe yaramıyor.
Rezan Achmad

11

Şimdi sorunuma cevabım var. Bağlantı için Brad'e teşekkürler , cevabı burada buluyorum . Ve fikir için J.Money'e teşekkürler . Çözümüm:

<?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" 

4
Hiç bir anlamı yok. FooBar::getClassName()her zaman 'FooBar'. Yazdığınız olsaydı Product::getClassName()- o zaman yazabilirsiniz 'Product'yanı yerine.
zerkms

7
Evet biliyorum .. Yazım hatasından kaçınmak istiyorum ve ayrıca sınıf adını yeniden çarpanlara ayırırken (IDE araçlarıyla), dizeyi aramam ve değiştirmem gerekmiyor.
Rezan Achmad

Bu, üst "Model" sınıfındaki alt sınıfın sınıf adını kullanmanız gerektiğinde de yardımcı olabilir.
JR Lawhorne

9

Sınıf adını almak için ReflectionClass kullanabilirsiniz.

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

Bu kod parçacığı çözüm olabilir, ancak bir açıklama dahil olmak , yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın.
yivi

Kesinlikle Özel !!! Bu SÜPER ama basit bir çözüm! Teşekkürler !!!!
Simone Campagna

5

Görünüşe göre ReflectionClassoldukça verimli bir seçenek.

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

Kıyaslama:

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

PHP'de 'öz' ve 'statik' arasındaki çok az farktan bahsetmenin önemli olduğunu düşünüyorum çünkü 'en iyi cevap', bazı insanlara kafa karıştırıcı sonuçlar verebilecek 'statik' kullanıyor.

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

Sonuçlar:

X: X, X
Y: Y, X
Z: Z, X

2

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

Class_Name::class: sınıfı ad alanıyla döndür. Yani sadece bir dizi oluşturmanız gerekir, ardından dizinin son değerini alın.


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

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

PHP 5.5'ten daha eski olanlar için


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.