いくつかのクラスのコードを節約するために、抽象クラスに取り組んでいました。これらのクラスはすべて、さまざまな静的呼び出しを通じて自身をインスタンス化するファクトリです。これらすべてのメソッドを抽象クラスに入れることで、いくつかのコードを節約できました。
しかし、遅い静的バインディングの問題に遭遇しました... 私たちの Web ホストは 5.3 以降を使用していないため、get_called_class にアクセスできません。私が持っている場合
$class = __CLASS__;
return new $class();
抽象クラスで__CLASS__
は、呼び出されたクラスを実際に使用したい場合の抽象クラスの名前です。
子クラスが独自のインスタンス化メソッドを持ち、抽象化された親に依存していない Web 上の抽象ファクトリの例を見てきました。ただし、この場合、抽象クラスを使用する唯一の理由はコードを保存することなので、そこでそれができなければ、その価値は大幅に低下します。
PHP < 5.3 で回避策はありますか? debug_backtrace()
?
編集:
私はテストを行いましたが、うまくいかdebug_backtrace()
ないようです!これがlate static bindingが必要な理由だと思います。
<?
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