ホームページ  >  記事  >  バックエンド開発  >  PHP のシングルトン モードから PHP オブジェクトの作成方法まで

PHP のシングルトン モードから PHP オブジェクトの作成方法まで

WBOY
WBOYオリジナル
2016-06-20 12:55:01960ブラウズ

最近面接に行ったところ、シングルトンモデルの問題に遭遇しました。面接は失敗しましたが、それでも良かったです。みんなと共有しましょう。
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));

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。