3 minutes to read, 5.86K views since 2016.10.13 Read in english

Получаем информацию о классе при помощи Reflection Api в PHP

Сегодня я собираюсь показать вам, как вы можете получить всю возможную информацию о классе в php, используя Reflection Api.

Сначала давайте создадим класс, который мы будем анализировать. Это сделано с целью показать вам особенности отражения.

class Person {

  const NAME_LENGTH_MAX = 50;

  protected $name;

  public function __construct($name){
    $this->name = $name;
  }

  /**
  * @return string
  */
  public function getName(){
    return $this->getName();
  }

  public static function generateName() {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $name = '';
    for ($i = 0; $i < self::NAME_LENGTH_MAX; $i++) {
        $name .= $characters[rand(0, $charactersLength - 1)];
    }
    return $name;
  }

}

Что можно сказать о классе Person? У него нет родительских классов (он не расширяет ни один класс). Он имеет одну константу, одно защищенное свойство, две функции и один конструктор. - Верно. Мы смогли получить всю эту информацию программным способом. Рассмотрим следующий скрипт:

function echoInfoOnClass($object) {
    $reflectionClass = new \ReflectionClass($object);

    echo "Name: " . $reflectionClass->getName() . PHP_EOL; // echo class name (with namespace if any)
    echo "Short name: " . $reflectionClass->getShortName() . PHP_EOL; // echo class name without namespace
    // show all methods

    echo PHP_EOL;
    echo "Constants:" . PHP_EOL . PHP_EOL;
    foreach ($reflectionClass->getConstants() as $constantName => $constant) {
        echo $constantName . ' = ' . $constant . PHP_EOL;
    }

    echo PHP_EOL;
    echo "Properties:" . PHP_EOL . PHP_EOL;
    foreach ($reflectionClass->getProperties() as $property) {

        $propModifiers = \Reflection::getModifierNames($property->getModifiers()); // list of method modifiers (public,static, ..)

        foreach ($propModifiers as $modifier) { // echo all modifiers with space
            echo $modifier . " ";
        }

        $property->setAccessible(true); // this method of ReflectionProperty class make possible to access private or protected data on classes

        echo $property->getName() . ' = ' . json_encode($property->getValue($object)) . PHP_EOL;
    }

    echo PHP_EOL;
    echo "Methods:" . PHP_EOL . PHP_EOL;
    foreach ($reflectionClass->getMethods() as $method) {

        $methodModifiers = \Reflection::getModifierNames($method->getModifiers()); // list of method modifiers (public,static, ..)

        foreach ($methodModifiers as $modifier) { // echo all modifiers with space
            echo $modifier . " ";
        }

        echo $method->getName();

        $params = [];
        foreach ($method->getParameters() as $methodParam) {
            $currentParam = $methodParam->getName();
            if ($methodParam->isDefaultValueAvailable()) {
                $currentParam .= '=' . $methodParam->getDefaultValue();
                if ($methodParam->isDefaultValueConstant()) {
                    $currentParam .= '(' . $methodParam->getDefaultValueConstantName() . ')';
                }
            }
            $params[] = $currentParam;
        }

        // glue together pairs paramname - defaultvalue if any
        echo '(' . implode(',', $params) . ')';

        echo PHP_EOL;
    }
}

Если мы запустим следующий код

echoInfoOnClass(new Person('Serhiy'));

мы получим следующий вывод

Name: App\Controllers\Person
Short name: Person

Constants:

NAME_LENGTH_MAX = 50

Properties:

protected name = "Serhiy"

Methods:

public __construct(name)
public getName()
public static generateName(length=50(self::NAME_LENGTH_MAX))

Как мы видим, мы собрали всю информацию о свойствах класса, константах и полях, включая видимость (public илиprotected или private), является ли онаstatic или нет, и даже значения свойств. Вы можете использовать мою функцию echoInfoOnClass в своих программах, если хотите.   Очень полезно понять, как мы получаем такой результат, читая код функции построчно.

Read next article Как вызвать метод в классе с динамически генерируемым именем через рефлексию в PHP in course Reflection in PHP