Platton
@Platton

Передача данных в уже созданый объект?

Иллюстрирую такой код для примера, который состоит из 5 классов.
- Класс Chief создает и возвращает объекты и имеет четыре наследника.
- Класс библиотеки Library с различными методами и свойствами, которые доступные для использования всеми последующими;
- Два класса модулей Module и один View - выводит общую картину.

error_reporting(E_ALL);

class Chief 
{
	private static $obs = array();
	private $classes = array(
		'lib'	=> 'Library',
		'mod1'	=> 'Module1',
		'mod2'	=> 'Module2',
		'view'	=> 'View',
	);
	
	public function __get($name)
	{
		// Определение имени классов в которых вызываются не определенные свойства
		$descendantClassName = get_class($this);
		echo $descendantClassName . '<br>';
		
		// Если объект уже существует, возвращаем его
		if(isset(self::$obs[$name]))
		{
			return(self::$obs[$name]);
		}
		// Определяем имя нужного класса
		$class = $this->classes[$name];
		
		// Сохраняем для будущих обращений к нему
		self::$obs[$name] = new $class();
		
		// Возвращаем созданный объект
		return self::$obs[$name];
	}
}

class Library extends Chief
{
	// Свойства и методы библиотеки выполняющие что-либо, созданные для примера
	
	public $prop_1;
	public $prop_2;
	public $prop_3;
	
	public function __construct(){}
	
	public function toolA(){}
	
	public function toolB(){}
	
	public function toolC(){}	
}

class Module1 extends Chief
{
	public function perf()
	{
		$this->lib->toolA();
		 $m2 = new Module2();
		 return $this->lib->prop_3 = $m2->perf();
	}
}

class Module2 extends Chief
{
	public function perf()
	{
		return $this->lib->toolC();
	}
}

class View extends Chief
{
	public function perf(){
		
		$this->lib->toolB();
		$content = new Module1();
		$content->perf();
		$this->lib->prop_1;	
	}
}

$res = new View();
print $res->perf();


Вопрос: нужно предавать объекту класса Library информацию о том в которых классах осуществляется его вызов, то есть переменную $descendantClassName.
Можно было б передать это параметром в конструкторе self::$obs[$name] = new $class($descendantClassName) и при создании объекта $this->lib использовать эту инфу. Но это возможно только 1 раз, при дальнейших вызовах объекта $this->lib он просто возвращается из массива с первоначально заложенным значением переменой $descendantClassName. Как тогда передавать классу Library постоянно меняющиеся данные из переменной $descendantClassName если возвращается уже созданный объект.
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Если возникает вопрос какой объект породил текущий объект - значит у вас явно что-то не то со структурой приложения. Такое поведение противоречит основным требованиям ООП.
Если ОЧЕНЬ надо, - поставьте галочку:
"я осознаю что делаю каку, но мне очень-очень нужно!" [ ]
и пройдите по секретной кривой дорожке ссылке, и почитайте тут тоже.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
02 мая 2024, в 21:59
15000 руб./за проект
02 мая 2024, в 21:54
1000 руб./в час
02 мая 2024, в 21:27
300000 руб./за проект