Можно ли перегрузить публичные (или доступные) свойства объекта?
Есть объект. Его protected свойства представлены в виде других объектов (точнее, изначально они представлены в виде массивов, и при инициализации замещаются на объекты нужных классов).
Всё хорошо, но хочется сделать это «лениво», т.е. чтобы свойства превращались в объекты только тогда, когда к ним пытаются обратиться.
Для обращений извне это реализовывается легко, магическим методом __get(). Но он не будет работать при обращении к этим свойствам «изнутри» (т.е. $this->protected_property), потому что изнутри эти свойства доступны.
Существует ли какой-то хитрый способ перегрузить доступные свойства?
<?php
class Bar implements ArrayAccess
{
protected $_hash = array();
public function offsetGet($offset) {
if (!isset($this->_hash[$offset])) return null;
$value = $this->_hash[$offset];
$is_factory = is_object($value) && method_exists($value, '__invoke');
return $is_factory ? $value() : $value;
}
public function offsetExists($offset) {
return isset($this->_hash[$offset]);
}
public function offsetSet($offset, $value) {
$this->_hash[$offset] = $value;
}
public function offsetUnset($offset) {
unset($this->_hash[$offset]);
}
public function __get($key)
{
return $this->offsetGet($key);
}
}
class Foo
{
public function __construct()
{
echo __METHOD__,"\n";
}
public function show()
{
echo "Hello\n";
}
}
$b = new Bar();
$b['obj'] = function() { return new Foo(); };
echo "run\n";
$b->obj->show();
При вызове будет:
run
Foo::__construct
Hello
Т.е. класс создается именно в момент обращения к полю.
А, да, так у меня так и было)
Я спрашивал на счет того, чтобы перегружать доступные свойства классов, которые напрямую заданы, а не сложены в специальный хэш.
Решением стало, собственно, при инстанциировании перенести эти свойства в хэш и кильнуть.
Такой изворот, т.к. это бибилиотека для дочерних классов)
Но за пример в любом случае спасибо