PHPでクラス名を取得するにはどうすればよいですか?


99
public class MyClass {

}

Javaでは、クラス名を取得できます String className = MyClass.class.getSimpleName();

PHPでこれを行うには?私はすでに知っていますがget_class()、オブジェクトに対してのみ機能します。現在、私はアクティブレコードで働いています。のようなステートメントが必要MyClass::classNameです。


1
phpで役立つかもしれない特定の例を挙げていただけますか?クラス名をハードコーディングした場合-引用符で囲んで、必要なものを取得できます。
zerkms 2013

2
残念ながら、RenameClassなどの自動リファクタリング(IDEなど)では、通常、このようなクラス名文字列の名前は変更されません。したがって、クラス名を取得するための静的な方法があれば、public $__CLASS__ = __CLASS__;他のすべてのクラスと一緒にダンスを行うのとは
異なり

回答:


114

PHP 5.5以降ではClassName :: classを介してクラス名解決を使用できます。

PHP5.5の新機能をご覧ください。

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

この機能をクラスメソッドで使用する場合は、static :: classを使用します。

<?php

namespace Name\Space;

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

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

?>

古いバージョンのPHPではget_class()を使用できます。


5
違いは何だstatic::classとはget_class_name()
Alexander Jank 2017

1
@AlexanderJank static::classコンパイル時に解決され、get_class_name()実行時に解釈されるようです。動的に生成されたクラスの:: classプロパティ(?)にアクセスしようとすると、次のエラーが発生しますDynamic class names are not allowed in compile-time ::class fetch。詳細については、この回答を参照してください。私はまた、ドキュメントからこのメモが役に立ったと感じました。
cjsimon

29

__CLASS__クラス内で使用して名前を取得できます。

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


3
ここですべての興味深いconstを表示することもできます:php.net/manual/en/language.constants.predefined.php
MatRt

リンクを提供してくれた@Bradのおかげで、私はここで
Rezan Achmad

2
@ user1073122、それが私の回答でリンクしたリンクです。
ブラッド

親クラスで定義されているメソッドでクラス名を取得しようとしたときに+1。他のソリューション(get_class($this)static::class)は、単に(親を拡張する)子クラス名を返します。
akinuri

続くself::classも、親クラス名を返すようです。
akinuri

22

自分の質問に答えたようですね。get_classクラス名を取得します。それは手続き的であり、それが混乱の原因です。のphpドキュメントを見てくださいget_class

以下がその例です。

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

それをあなたの例のようにするには、次のようにすることができます:

 <?php

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

今あなたはできる:

 $className = MyClass::getClass();

ただし、これは多少制限されます。私のクラスが拡張されても、「MyClass」が返されるからです。get_called_class代わりに使用できます。これは、比較的新しい機能であるLate Static Bindingに依存しており、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'

@ J.Moneyに感謝します。しかし、継承では機能しません。
Rezan Achmad、2013

11

今、私は私の問題の答えを持っています。リンクをありがとうブラッド、私はここで答えを見つけますJ.Moneyに感謝します。私の解決策:

<?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
意味がない。FooBar::getClassName()常に'FooBar'です。入力できれば、代わりにProduct::getClassName()入力することもでき'Product'ます。
zerkms 2013

7
はい、わかりました。タイプミスを避けたいし、クラス名を(IDEツールで)再ファクタリングするときにも、文字列を検索して置き換える必要はありません。
Rezan Achmad、2013

これは、親の「モデル」クラスで子クラスのクラス名を使用する必要がある場合にも役立ちます。
JRローホーン

8

クラス名を取得するには、ReflectionClassを使用できます

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

このコードスニペットが解決策になる可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
yivi

絶対にスペシャル!!! これは非常に簡単な解決策です。ありがとう!!!!
Simone Campagna

4

ReflectionClassかなり生産的なオプションのようです。

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

基準:

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での「自己」と「静的」の違いがほとんどないことは重要です。

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

結果:

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

2

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

Class_Name::class:名前空間を持つクラスを返します。したがって、配列を作成するだけで、配列の最後の値を取得できます。


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

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

PHP 5.5より古い場合


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.