Je travaillais sur une classe abstraite pour économiser du code sur quelques classes. Ces classes sont toutes des usines qui s'instancient à travers différents appels statiques. Je pourrais sauver du code en mettant toutes ces méthodes dans une classe abstraite.Résumé Les usines ne sont pas possibles en PHP <5.3?
Cependant, j'ai rencontré un problème de liaison statique tardive ... étant donné que notre hébergeur n'utilise pas la version 5.3 ou ultérieure, je n'ai pas accès à get_called_class. Si j'ai dans la classe abstraite
$class = __CLASS__;
return new $class();
, __CLASS__
est le nom de la classe abstraite, quand je veux réellement utiliser la classe appelée. J'ai vu des exemples d'usines abstraites sur le web où les classes enfants ont leurs propres méthodes d'instanciation, et ne comptent pas sur le parent abstrait pour cela. Cependant, dans cette situation, la seule raison de la classe abstraite est de sauvegarder le code, donc si je ne peux pas le faire, la valeur de celle-ci diminue grandement.
Y a-t-il une solution de contournement dans PHP < 5.3? debug_backtrace()
?
Edit:
j'ai fait un test et il semble debug_backtrace()
ne fonctionnera pas! Je suppose que c'est pourquoi nous avons besoin liaison statique tardive.
<?
abstract class abstractFactory {
public function create() {
print_r(debug_backtrace());
$class = __CLASS__;
return new $class();
}
}
class concreteFactory extends abstractFactory {}
$chimborazo = concreteFactory::create();
et le résultat:
$ 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
Il n'utilise pas 5.3, donc il n'a pas le '__CLASS__ 'constant pour commencer ... – Charles
Je suis l'OP;)' __CLASS__' est disponible depuis la version 4.3: http://php.net/manual/fr/language.constants.predefined.php. J'utilise 5.2.6 et je l'utilise tout le temps. – user151841
J'ai besoin d'apprendre à lire, hein. – Charles