Передача данных в уже созданый объект? Иллюстрирую такой код для примера, который состоит из 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 . ''

// Если объект уже существует, возвращаем ег
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 Chie

// Свойства и методы библиотеки выполняющие что-либо, созданные для пример

public $prop_1
public $prop_2
public $prop_3

public function __construct(){

public function toolA(){

public function toolB(){

public function toolC(){}

class Module1 extends Chie

public function perf(

$this->lib->toolA()
$m2 = new Module2()
return $this->lib->prop_3 = $m2->perf()

class Module2 extends Chie

public function perf(

return $this->lib->toolC()

class View extends Chie

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 если возвращается уже созданный объект.

21 Авг 2019 в 07:04
149 +1
0
Ответы
1

В данном случае можно создать метод в классе Chief, который будет обновлять информацию о том, в каком классе происходит вызов объекта Library. Например, можно добавить метод setDescendantClassName($className) в класс Chief, который будет обновлять значение переменной $descendantClassName. Затем этот метод можно вызывать перед каждым использованием объекта Library в дочерних классах:

class Chief

private static $obs = array()
private $classes = array
'lib' => 'Library'
'mod1' => 'Module1'
'mod2' => 'Module2'
'view' => 'View'
)
private $descendantClassName
public function __get($name

// Если объект уже существует, возвращаем ег
if(isset(self::$obs[$name])

return(self::$obs[$name])

// Определяем имя нужного класс
$class = $this->classes[$name]
// Сохраняем для будущих обращений к нем
self::$obs[$name] = new $class()
// Устанавливаем значение переменной $descendantClassNam
self::$obs[$name]->setDescendantClassName($this->descendantClassName)
// Возвращаем созданный объек
return self::$obs[$name]

public function setDescendantClassName($className

$this->descendantClassName = $className

class Library extends Chie

// Свойства и методы библиотек
private $descendantClassName
public function setDescendantClassName($className

$this->descendantClassName = $className

// Ваши метод

class Module1 extends Chie

public function perf(

$this->lib->setDescendantClassName(get_class($this))
$this->lib->toolA()
$m2 = new Module2()
return $this->lib->prop_3 = $m2->perf()

// Аналогично для других дочерних классо
$res = new View()
$res->perf();

Таким образом, вы сможете передавать классу Library информацию о текущем классе, в котором происходит вызов объекта, перед каждым использованием этого объекта из дочерних классов.

20 Апр в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 620 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир