Класс PHP динамически расширяется во время выполнения

Можно ли динамически расширять объект класса в PHP? И что было бы самым элегантным способом сделать это?

Некоторые примеры кода для дальнейшего объяснения:

class BasicClass {

private $variable;

public function BasicFunction() {
// do something
$this->variable = 10;
}

}

class ExtendedClass extends BasicClass {

public function ExtendedFunction() {
// do something else with basic class variable
return $this->variable/2;
}

}

$A = new BasicClass();

If(condition for extension){

// A should be of class ExtendedClass
// and the current class variables should be kept
// ... insert the magic code here ...
// afterwards we would be able to use the ExtendedFunction with the original variables of the object

$A->ExtendedFunction();

}

Одним из способов решения этой проблемы было бы создание нового объекта ExtendedClass и копирование всех переменных из старого объекта. Но можно ли сделать это более элегантно?

0

Решение

Да. Это возможно. Один из способов сделать это будет использовать анонимные занятия или просто перезаписать сам класс (в вашем случае $A) но это подразумевает немного больше логики, и это не так чисто, поэтому я не буду вдаваться в подробности.

НОТА: Поддержка анонимных классов была добавлена ​​в PHP 7.

Используя ваш пример выше, мы можем составить следующий код (я изменил видимость свойства, чтобы иметь возможность использовать его в расширенном классе. Я бы предложил добавить добытчик а не меняя видимость).

class BasicClass {

public $variable;

public function BasicFunction() {
// do something
$this->variable = 10;
}

}

class ExtendedClass extends BasicClass {

public function ExtendedFunction() {
// do something else with basic class variable
return $this->variable / 2;
}

}

$A = new BasicClass();

if (TRUE) {

// A should be of class ExtendedClass
$A = new class extends ExtendedClass {

};

$A->ExtendedFunction();
}

Обратите внимание, что это будет затирать $A, Вы по-прежнему будете иметь все доступные методы, поскольку при этом наследование не теряется.


Очевидно, какой бы подход вы ни предприняли, это будет не самым чистым способом, которым вы можете это сделать.

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


Вы также можете достичь магии, используя eval и, возможно, Reflection, но они настолько волшебны, что я отказываюсь писать ответ, потому что это способствует таким плохим практикам.

1

Другие решения

Других решений пока нет …