Как мне получить имя класса в PHP?


public class MyClass {

}

в Java, мы можем получить имя класса с String className = MyClass.class.getSimpleName();

как это сделать в PHP? Я уже знаю get_class(), но это работает только для объектов. В настоящее время я работаю в Active Record. Мне нужно заявление, как MyClass::className.

7 63
php

7 ответов:

начиная с 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 ().

можно использовать __CLASS__ внутри класса, чтобы получить имя.

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

похоже, вы ответили на свой вопрос. 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 вместо этого, который полагается на Поздняя Статическая Привязка, относительно новая функция, и требует 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. Деньги за идею. Мое решение:

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

Я думаю, что важно упомянуть небольшую разницу между "само" и "статическим" в 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

чтобы получить имя класса, вы можете использовать ReflectionClass

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}
<?php
namespace CMS;
class Model {
  const _class = __CLASS__;
}

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

для старше PHP 5.5