Как создать многомерный объект с методами?

class DICT {
	
		// список объектов
		private $objects		= [];
		
		// создание объекта
		public function __set($name, $value){
			if( !isset( $this->objects[$name] ) ){
				$this->objects[$name] = $value;
			}else{
				echo 'DICT name "'. $name .'" is already exist!';
			}
    	}
		
		// вызов объекта
		public function __call($name, $args){
			if( isset( $this->objects[$name] ) ){
				return call_user_func_array($this->objects[$name], $args);
			}else{
				echo 'DICT name "'. $name .'" is not exist!';
			}
		}
		
	}

    $a = new DICT;
    $a->b = function(){ echo 'b'; };
    $a->c = new DICT;
    $a->b(); // работает
    $a->c->d = function(){ echo 'd'; };
    $a->c->d(); // warning Creating default object from empty value - и не выводит 'd'

Предупреждение, типа я пытаюсь присвоить не созданному объекту свойство.
В чем может быть проблема? Спасибо!

Рабочий вариани (by Алексей Уколов)
class DICT {
	
		// список объектов
		private $objects		= [];
		
		// создание объекта
		public function __set($name, $value){
			$this->objects[$name] = $value;
    	}
		
		// вызов объекта
		public function __call($name, $args){
			return call_user_func_array($this->objects[$name], $args);
		}
		
		// вызов объекта
    	public function __get($name){
    		return $this->objects[$name];
    	}
		
	}
	
	$a = new DICT;
	$a->b = function(){
		echo 'test 1';
	};
	$a->b(); // "test 1"
	$a->c = new DICT;
	$a->c->d = function(){
		echo 'test 2';
	};
	$a->c->d(); // "test 2"
  • Вопрос задан
  • 285 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Раз у вас кастомный сеттер, то и геттер должен быть:
public function __get($name) {
    return $this->objects[$name];
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы