скажи, у меня есть этот класс:
class Foo {
var $pu = 0;
private $pr = 1;
}
Мне нужно найти способ проверить уровень модификатора доступа одного свойства, например:
class Foo {
var $pu = 0;
private $pr = 1;
function return_all_public () {
$publics = [];
for (get_object_vars($this) as $key => $value) {
// if $this->{$key} is public then array_push($publics, $key);
}
return $publics;
}
}
Это всего лишь пример, функция не то, что я пытаюсь достичь, просто я хочу знать, как проверить уровень модификатора доступа одного свойства (публичное, защищенное или частное?)
использование ReflectionObject
:
foreach ((new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
$publics[] = $property->getName();
}
Или даже:
$publics = array_map(function (ReflectionProperty $property) {
return $property->getName();
}, (new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC));
Рекомендации:
http://php.net/manual/en/class.reflectionobject.php
http://php.net/manual/en/reflectionclass.getproperties.php
http://php.net/manual/en/class.reflectionproperty.php
РЕДАКТИРОВАТЬ Чтобы уточнить — не используйте это, это явно ошибка, которая, кажется, была исправлена в php версии 7. http://codepad.viper-7.com/lyULdW (изменить версию на <= 5,6, чтобы увидеть, как это работает)
Ответ @deceze является наиболее надежным, но, как вы указали, предпочтение вызывается функциями без создания нового объекта:
class Foo
{
var $pu = 0;
private $pr = 1;
function return_all_public () {
return call_user_func('get_object_vars', $this);
}
}
Неясно, является ли эта проблема с областью функциональностью или ошибкой!