Получить публичные c свойства, которые не являются c с PHP Отражение - PullRequest
3 голосов
/ 18 февраля 2020

Мне нужно использовать PHP Reflection API , чтобы получить все общедоступные свойства для класса, которого не указано c.

In Чтобы получить только свойства publi c, которые не являются stati c, я смог увидеть только один способ получить свойства IS_STATI C и использовать array_diff(), чтобы получить только свойства publi c .

Конечный класс выглядит следующим образом:

class foo {
    public static $a;
    public static $b;
    public static $c;

    public $d;
    public $e;
    public $f;

    public function reflect()
    {
        $reflection = new ReflectionClass($this);
        $public = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
        $static = $reflection->getProperties(ReflectionProperty::IS_STATIC);
        $properties = array_diff($public, $static);
        foreach($properties as $property) {
            echo $property->name . "n";
        }
    }

}

Вызов:

$foo = new foo;
$foo->reflect();

Вывод reflect() теперь выглядит следующим образом:

d
e
f

Вопрос: Есть ли лучший способ сделать это?

Примечание : Мой первоначальный класс слишком длинный! Этот класс является примером для меня.

1 Ответ

4 голосов
/ 18 февраля 2020

Самый быстрый способ - это, безусловно, использовать get_object_vars, для вашего случая:

print_r(get_object_vars($foo)); 
// outputs
Array
(
    [d] => 
    [e] => 
    [f] => 
)

Ключи - это имена собственников.

Но создание экземпляра может быть довольно тяжелым. Таким образом, вы все еще можете использовать отражение и немного фильтрации:

public function reflect()
{
    $reflection = new ReflectionClass($this);
    $properties =  array_filter(
        $reflection->getProperties(ReflectionProperty::IS_PUBLIC),
        function ($property) {
            return !$property->isStatic();
        }
    );
    foreach($properties as $property) {
        echo $property->name . "\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...