2013-02-27 2 views
57
public class MyClass { 

} 

、我々は、PHPでこれを行うにはどのようにString className = MyClass.class.getSimpleName();PHPでクラス名を取得するにはどうすればよいですか? Javaでは

でクラス名を取得することができますか?私はすでにget_class()を知っていますが、オブジェクトに対してのみ動作します。現在、私はActive Recordで働いています。私はMyClass::classNameのような声明が必要です。

+1

それはPHPで役立つかもしれないときに特定の例を挙げてもらえますか?クラス名をハードコードした場合は、引用符で囲み、必要なものを得ることができます。 – zerkms

+1

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

+1

[クラス名を拡張PHPクラスの静的呼び出し?](https://stackoverflow.com/questions/506705/how-can-i-get-the-classname-from-a-static-call-in-an-extended-php -class) – Theraot

答えて

68

PHP 5.5ので。

new features of PHP5.5を参照してください。

<?php 

namespace Name\Space; 

class ClassName {} 

echo ClassName::class; 

?> 

あなたは、静的なクラスメソッドを使用でこの機能を使用する場合は::クラス:PHPの古いバージョンの

<?php 

namespace Name\Space; 

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

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

?> 

、あなたはget_class()を使用することができます。私は「最高の答えが」紛らわしい結果を与えることのできる「静的」を使用して、それがPHPの「自己」と「静」の間にはほとんど違いを言及することが重要だと思うより古いPHP 5.5

+0

'static :: class'と' get_class_name() 'の違いは何ですか? –

21

__CLASS__をクラス内で使用すると、名前を取得できます。

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

+2

また、ここで興味深いすべてのconstを見ることができます:http://php.net/manual/en/language.constants.predefined.php – MatRt

+0

リンクのための@ブラッドのおかげで、私は答え[ここに](http://www.php.net/manual/en/language.constants.predefined.php#84050) –

+2

@ user1073122、それは私が私の答えでリンクされたリンクです。 – Brad

10

あなたがあなた自身の質問に答えのように聞こえます。 get_classがクラス名を取得します。それは手続き的なものであり、それが混乱の原因となっているかもしれません。あなたが行うことができます今すぐ

<?php 

class MyClass 
{ 
     public static function getClass() 
     { 
      return 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 

が、それはより多くのあなたの例のようなあなたのような何かができるようにするには:ここで

get_classのためのPHPのドキュメントを見てみましょうことはその例です。

$className = MyClass::getClass(); 

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

アイデアのおかげで、@ J.Money ..しかし、それは継承で動作しません。 –

+3

あなたの質問にあなたが望むものを置くなら、私たちはそれをより良く答えることができます。 –

10

今、私は私の問題に答えました。リンクのためにBradのおかげで、答えはhereです。アイデアのために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

+6

はい私は知っている..私はタイプミスを避けたいと思うし、またクラス名を(IDEツールを使って)再ファクタリングするときに、私は文字列を検索して置き換える必要はない。 –

+0

いいえ、意味があります – zerkms

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

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

いくつかの人々に。

<?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 
1
$foo = (new \ReflectionClass($this))->getShortName(); 
+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](レビュー/低品質の投稿/ 17731082) –

+0

このコードスニペットが解決策であるかもしれませんが[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-コードベースの回答)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – yivi

関連する問題