Предположим, что у вас есть класс A с частным свойством $ a и класс B, который наследует его. Если я использую ReflectionClass :: getProperty в экземпляре B, я получаю фатальную ошибку, что свойство не существует. Это имеет смысл, так как это частный метод. Однако ReflectionClass :: hasProperty возвращает true, тем не менее. Это ошибка?
Поэтому я работаю с классом настроек, который расширяет базовый класс настроек, который будет похож на «глобальные настройки». Существует несколько сервисов, и каждая служба имеет свой собственный класс настроек, который расширяет класс базовых настроек. Класс абстрактных базовых настроек соответствует настройкам, которые совместно используются службами. Поэтому сначала я проиллюстрирую приведенный ниже пример, а затем определю проблему: пример: […]
Я пытаюсь получить доступ / изменить свойства класса «Родитель через отражение». Если я запускаю ReflexClass :: getProperties () для дочернего элемента, он также возвращает любые свойства, которые имеет родитель? Если это не так, есть ли способ доступа к родительским свойствам с помощью Reflection?
Чтобы восстановить состояние объекта, который был сохранен, я хотел бы создать пустой экземпляр класса без вызова его конструктора, чтобы позже установить свойства с помощью Reflection . Единственный способ, которым я нашел, как это делает Doctrine , – создать поддельную сериализацию объекта и unserialize() : function prototype($class) { $serialized = sprintf('O:%u:"%s":0:{}', strlen($class), $class); return unserialize($serialized); } […]
Я рассматривал методы отражения php, то, что я хочу сделать, – это ввести некоторый код после открытия метода и до любого возвращаемого значения, например, я хочу изменить: function foo($bar) { $foo = $bar ; return $foo ; } И добавьте в него код: function foo($bar) { //some code here $foo = $bar ; //some code […]
В чем разница между двумя. оба они работают точно так же. public static function getArgsArray($reflectionMethod,$argArray){ $arr = array(); foreach($reflectionMethod->getParameters() as $key => $val){ $arr[$val->getName()] = isset($argArray[$val->getName()]) ? $argArray[$val->getName()] : (isset($_REQUEST[$val->getName()]) ? $_REQUEST[$val->getName()] : ($val->*isDefaultValueAvailable()* ? $val->getDefaultValue() : NULL)); } return $arr; }
class A { private $a; } class B extends A { function __construct() { (new \ReflectionClass($this))->getProperty('a')->setAccessible(true); echo $this->a; } } (new B()); это должно работать, хотя оно вызывает исключение: «property a doesnt exists». Многие статьи говорят, что отражение – это решение
Это проще всего объяснить на примере: class Example { private $x; public $f; public function __construct() { $this->x = 10; $this->f = function() { return $this->x; }; } } $ex = new Example(); $f = new ReflectionFunction($ex->f); echo $f->invoke().PHP_EOL; Выполнение этого приводит к ошибке: PHP Неустранимая ошибка: Непринятая ошибка: использование $ this, если не в […]
Кажется, это не работает: $ref = new ReflectionObject($obj); if($ref->hasProperty('privateProperty')){ print_r($ref->getProperty('privateProperty')); } Он попадает в цикл IF, а затем выдает ошибку: Свойство privateProperty не существует : | $ref = new ReflectionProperty($obj, 'privateProperty') тоже не работает … На странице документации перечислены несколько констант, включая IS_PRIVATE . Как я могу использовать это, если я не могу получить доступ […]
Учитывая следующий случай: <?php class ParentClass { public $attrA; public $attrB; public $attrC; public function methodA() {} public function methodB() {} public function methodC() {} } class ChildClass extends ParentClass { public $attrB; public function methodA() {} } Как я могу получить список методов (и, желательно, класс vars), которые переопределены в ChildClass? Спасибо, Джо EDIT: […]