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.