私はhabrahabr.ruのいくつかの記事からこのコードを持っています:
abstract class Singleton {
protected static $_instances = array();
protected function __construct() {
}
public static function getInstance() {
$class = \get_called_class();
if ( !isset( static::$_instances[$class] ) )
static::$_instances[$class] = new static;
return static::$_instances[$class];
}
}
Auhtorは、たとえば、
class B extends Singleton {
private $_a = 10;
}
しかし、この場合の「static」と「self」の主な違いを理解することはできません。たとえば、$ _ instancesをpublicとして定義し、次のような別のクラスを作成しようとした場合です。
class C extends Singleton {
private $_z = 55;
}
シングルトンを抽象クラスではないものとして定義します。getInstanceを呼び出すたびに、どちらの場合も同じインスタンスの配列があります。static:: $_instancesとself::$ _ instances:
$s = Singleton::getInstance();
print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);
$b_instance = B::getInstance();
print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);
$c_instance = C::getInstance();
print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);
anobodyは私を助けて、なぜ$ _instances配列が同じであるのか、そしてなぜ作者は自分自身ではなく静的を使用するのかを教えてくれますか?どうもありがとうございました、私の英語をごめんなさい。