基本的なプログラミング: シングルトン モードの問題について、専門家が話をします~~~
class Example
{
// この属性にクラス インスタンスを保存します
private static $instance;
// オブジェクトの直接作成を防ぐために、コンストラクターはプライベートとして宣言されます
private function __construct()
{
echo 'I am construction
';
}
// シングルトン メソッド
public static function singleton()
{
if(!isset(self::$instance))
{
$c= __CLASS__;
self::$instance=new $c;
}
return self::$instance;
}
//クラス例
の通常のメソッド public function bark()
{
echo 'Woof!';
}
// ユーザーがオブジェクト インスタンスをコピーできないようにします
public function __clone ()
{
trigger_error('クローンは許可されていません。', E_USER_ERROR);
}
public function destroy()
{
unset(self::$インスタンス) ;
}
}
// コンストラクターが private として宣言されているため、この書き方は失敗します
//$test = new Example;
//以下は Example クラスのシングルトン オブジェクトを取得します
$test = Example::singleton();
$test->bark();
// オブジェクトをコピーすると E_USER_ERROR が発生します。
//$test_clone = clone $test;
$b=Example::singleton();
$b->destroy( );
?>
原文: http://www.php.net/manual/zh/ language.oop5.patterns。 php
ここで質問したいのは:
1) $b=Example::singleton(); は新しいオブジェクトを生成するのか、それとも
の両方を生成するのか $ test と $b は Example::singleton () を指します。この生成されたオブジェクトは?
2) destroy() メソッドでエラーが発生するのはなぜですか? Example::singleton() オブジェクトを破棄するか、null にする方法はありますか?
これにより、$test と $b は同時に null になりますか?
------解決策--------------------------------
is private function __clone, singleton この概念は完全に混乱しています。シングルトン オブジェクトを解放するには、独立したパブリック静的インターフェイスを提供する必要があります。
1、同じオブジェクト
2 は、前述のように null になりません。オブジェクトは参照であるため、これら 2 つの変数はもう使用しないでください。
------解決策---------
小さなテストを作成します
<?php クラスこんにちは { パブリック静的 $i; パブリック静的関数 getI() { if( ! self::$i インスタンスオブセルフ){ self::$i = 新しい自分; } // 変数に関する情報を出力します debug_zval_dump(self::$i); // この文を最初にコメントアウトしても構いません self::$i = null; debug_zval_dump(self::$i); 自分自身を返します::$i; } プライベート関数 __construct(){} プライベート関数 __clone(){} } $i = hello::getI(); debug_zval_dump($i); debug_zval_dump(hello::$i); /**出力: // 1 object(hello)#1 (0) refcount(2){ } // 2番目 NULL 参照カウント(2) // 3、4 NULL 参照カウント(3) NULL 参照カウント(3)*/ <br><font color="#e78608">------解決策--------</font><br>私も自分で試しました。オブジェクトごとに 1 つのオブジェクトです。 , 変数参照は2つの参照なので、先頭のnullと$iはこうなります、正しいかどうかは分かりませんが、正しいかどうかは関係ありません。 <br><br> <br><font color="#e78608">------解決策---------</font><br>