ホームページ > バックエンド開発 > PHPチュートリアル > 基本的なプログラミング:シングルトンモデルに関する問題について、専門家が話をします〜

基本的なプログラミング:シングルトンモデルに関する問題について、専門家が話をします〜

WBOY
リリース: 2016-06-13 13:33:49
オリジナル
756 人が閲覧しました

基本的なプログラミング: シングルトン モードの問題について、専門家が話をします~~~
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コード
<?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>
ログイン後にコピー
話し合う
2) destroy() メソッドでエラーが発生するのはなぜですか? Example::singleton() オブジェクトを破棄するか、null にする方法はありますか?
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート