Я работал над абстрактным классом, чтобы сэкономить на некотором коде для пары классов. Эти классы являются фабриками, которые создают себя с помощью различных статических вызовов. Я мог бы сохранить некоторый код, поместив все эти методы в абстрактный класс.
Однако я столкнулся с проблемой поздней статической привязки ... поскольку наш веб-хост не использует 5.3 или более позднюю версию, у меня нет доступа к get_called_class. Если у меня есть
$class = __CLASS__;
return new $class();
в абстрактном классе, __CLASS__
- это имя абстрактного класса, когда я действительно хочу, чтобы он использовал вызываемый класс.
Я видел примеры абстрактных фабрик в сети, где у дочерних классов есть свои собственные методы создания экземпляров, и они не полагаются на это для абстрактного родителя. Однако в этой ситуации единственной причиной для абстрактного класса является сохранение кода, поэтому, если я не могу сделать это там, значение этого значительно уменьшается.
Есть ли обходной путь в php <5.3? <code>debug_backtrace()
Edit:
Я сделал тест, и кажется, debug_backtrace()
не будет работать! Наверное, поэтому нам нужно позднее статическое связывание .
<?
abstract class abstractFactory {
public function create() {
print_r(debug_backtrace());
$class = __CLASS__;
return new $class();
}
}
class concreteFactory extends abstractFactory {}
$chimborazo = concreteFactory::create();
и результат:
$ php test.php
Array
(
[0] => Array
(
[file] => /var/www/test.php
[line] => 13
[function] => create
[class] => abstractFactory
[type] => ::
[args] => Array
(
)
)
)
Fatal error: Cannot instantiate abstract class abstractFactory in /var/www/test.php on line 7