最近面接に行ったところ、シングルトンモデルの問題に遭遇しました。面接は失敗しましたが、それでも良かったです。みんなと共有しましょう。
php はプロセスとして実行されるため、マルチスレッドの問題は無視され、属性をロックする必要はありません。一般的に使用されるシングルトン パターン クラス。
シングルトン モードの実行シナリオでは、プロセス内で特定のクラスのインスタンスが 1 つだけ実行される場合があります。
よく使われるシングルトンパターンは次のように書きます。
class SingleClass{
private static $instance = null;
//構築メソッド
private function __construct(){
echo “new obj”;
}
//インスタンスを取得
public static function getInstance(){
if(empty(self::$instance)){
self::$instance = new self();
}
return self ::$instance;
}
}
//$sc = new SingleClass();//エラーを報告
$sc = SingleClass::getInstance();//シングルトン モードを作成
問題ないようですが、クローンしたらどうなるのでしょうか?
(オブジェクトのコピーは clone キーワードを通じて実行できます)
$sc2 = clone $sc;//新しいオブジェクトのクローンを作成します
var_dump($sc,$sc2);
出力:
new objclass SingleClass#1 (0) {
}
class SingleClass#2 (0) {
}
このクラスは、実際には同じプロセスで新しいオブジェクトを生成します。
回避方法この問題。
class SingleClass{
private static $instance = null;
//構築メソッド
private function __construct(){
echo “new obj”;
}
//インスタンスを取得
public static function getInstance(){
if(empty(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
private function __clone(){ echo "clone";}
}
//$sc = new SingleClass();//エラーレポート
$sc = SingleClass::getInstance( ) ;//シングルトン モードを作成します
$sc2 = clone $sc;//新しいオブジェクトのクローンを作成します
//var_dump($sc,$sc2);
コードを実行すると、エラーが報告されます。
新しい objPHP の致命的なエラー: /Users/kang/Documents/phpProject/test/test.php の行のコンテキスト '' からプライベート SingleClass::__clone() を呼び出します
これは最も一般的な問題ですin PHP 良いシングルトンパターン。
この問題の本質は何ですか? php がオブジェクトを作成する方法。
PHP ソース コードで PHP オブジェクトがどのように表現されるかについては、ソース コードを参照してください。
PHP がオブジェクトを作成する方法については上で説明しました。
1 new classname(); 2 clone object
3 番目の方法はリフレクションを使用する方法です
$reflect = new ReflectionClass($sc);
$method = $reflect->getMethod ( "getInstance");
var_dump($method->invoke($sc));