ホームページ  >  記事  >  バックエンド開発  >  シングルトン パターンを使用するクラスには、静的メンバーに関していくつかの問題があります。

シングルトン パターンを使用するクラスには、静的メンバーに関していくつかの問題があります。

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

シングルトン モードの次のデータベース クラス:

class Database{	static private $db;	private function __construct(){	}	static function getInstance(){		if(self::$db){			return self::$db;		}else{			self::$db = new self();			return self::$db;		}			}}

静的メソッドは非静的メンバーを呼び出すことができないという格言があります。
このクラスの定義には次の文があります: self::$db = new self(); この self() メソッドは非静的コンストラクターではないでしょうか?
それとも、「静的メソッドは非静的メンバーを呼び出すことができない」という記述は不正確ですか?先輩方、アドバイスをお願いします。


ディスカッションへの返信 (解決策)

わかりました、私の質問は間違っています。これはオブジェクトをインスタンス化するためのステートメントであり、メンバー

self と $this はどちらもクラス自体
を参照しますが、前者は静的メソッドで使用され、後者は動的メソッド (インスタンス化されたオブジェクト) で使用されます。メソッド

new はインスタンス化されたクラスであり、コンストラクターは静的であることはできません。

歴史的な理由により、E_STRICT レベルのチェックは、 PHP クラスには静的または非静的はありません

error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT );class T {  function a() {    echo 'abc';  }}T::a();
abc

これが php の起源です
これらのロックを削除するともっと楽しくなりませんか?

self と $this は両方ともクラス自体を参照します
前者は静的メソッドで使用され、後者は動的 (インスタンス化されたオブジェクト) メソッドで使用されます

new はインスタンス化されたメソッドです

歴史的な理由により、E_STRICT レベルのチェックがオフになっている場合、PHP クラスは静的ではなくなることに注意してください


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