Я работал над абстрактным классом, чтобы сэкономить на некотором коде для пары классов. Эти классы - все фабрики, которые создают себя через разные статические вызовы. Я мог бы сэкономить некоторый код, поместив все эти методы в абстрактный класс.Реферат Фабрики невозможны в php <5.3?
Тем не менее, я столкнулся с проблемой поздней статической привязкой ... поскольку наш веб-хост не использует 5.3 или новее, у меня нет доступа к get_called_class. Если у меня есть
$class = __CLASS__;
return new $class();
в абстрактном классе, __CLASS__
этого имя абстрактного класса, когда я на самом деле хочу, чтобы использовать названный класс.
Я видел примеры абстрактных фабрик в Интернете, где дочерние классы имеют свои собственные методы создания экземпляров и не полагаются на абстрактного родителя для него. Однако в этой ситуации единственной причиной абстрактного класса является сохранение кода, поэтому, если я не могу этого сделать, значение его значительно уменьшится.
Есть ли обходной путь в php < 5.3? 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
Он не использует 5.3, поэтому у него нет '__CLASS__ 'константа для начала ... – Charles
Я - ОП;)' __CLASS__' был доступен с 4.3: http://php.net/manual/en/language.constants.predefined.php. Я использую 5.2.6, и я использую его все время. – user151841
Мне нужно научиться читать, хе-хе. – Charles