Подтвердить что ты не робот

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

public class MyClass {

}

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

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

4b9b3361

Ответ 1

С 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().

Ответ 3

Похоже, ты ответил на свой вопрос. 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 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'

Ответ 4

Теперь у меня есть ответ на мою проблему. Благодаря Brad для ссылки я найду ответ здесь. И благодаря 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" 

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

старше PHP 5.5

Ответ 8

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

Class_Name::class: вернуть класс с пространством имен. Поэтому после того, как вам нужно только создать массив, получите последнее значение массива.

Ответ 9

Похоже, 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]