-
- class A{
- private function __construct(){}
- }
- $a = new A();
- ?>
コードをコピー
プログラムの実行結果は次のとおりです。
致命的なエラー: E:PHPProjectstest.php の 6 行目で無効なコンテキストからプライベート A::__construct() を呼び出します
このクラスをインスタンス化するために new を外部から使用することは禁止されています。ユーザーがこのクラスにアクセスできるようにするにはどうすればよいですか?正面玄関が塞がれているため、ユーザーのために裏口を残しておく必要があります。
解決策は、静的に変更されたメソッドです。クラスをインスタンス化せずに、このメソッドに直接アクセスできます。
// new. でインスタンス化できないクラス
//静的メソッドは外部アクセス用に予約されています
// メソッド内のインスタンスを返します。
-
- class A{
- private function __construct(){}
- static function getClassA(){
- $a = new A();
- return $a;
- }
- }
- // 見てくださいここで実際に返されるのは A のインスタンスです。しかし、それは同じオブジェクトではありません。
- $a1 = A::getClassA();
- $a2 = A::getClassA();
- echo "$a1 のクラスは".get_class( $a1)." 、$a2 は ".get_class($a1);
- if($a1 === $a2){
- echo "
$a1 $a2 は同じオブジェクトを指します。 ";
- }else{
- echo "
$a1 $a2 はオブジェクトではありません。"; - }
- ?>
コードをコピーします
プログラムの実行結果は次のとおりです。
$a1 のクラスは A 、 $a2 は A
$a1 $a2 はオブジェクトではありません。
静的メソッドを通じて A のインスタンスを返しました。しかし、まだ問題があります。複数の操作を通じて同じインスタンスを確実に取得するにはどうすればよいでしょうか?
解決策:
内部的には静的属性が 1 つだけあります。
静的属性は、静的メソッドによって効果的に呼び出すことができます。また、外部呼び出しを防止するには、このプロパティをプライベートに設定します。
まず、このプロパティを null に設定します。オブジェクトが返されるたびに、まずこのプロパティが null かどうかを確認します。
null の場合、このクラスの新しいインスタンスを作成し、それをこの静的プロパティに割り当てます。空でない場合は、インスタンスを指す静的プロパティを返します。
// new. でインスタンス化できないクラス
//静的メソッドは外部アクセス用に予約されています
// メソッド内のインスタンスを返します。
//このインスタンスが静的メソッドで確実に呼び出せるように、静的属性を定義します。
//判定部分を追加
-
- class A{
- private static $a = null;
- private function __construct(){}
- static function getClassA(){
- if( null == self::$a){
- self::$a = new A();
- }
- return self::$a;
- }
- }
- // ここでは実際に A のインスタンスが返されていることがわかりますが、それは同じオブジェクトではありません。 $a1 = A ::getClassA();
- $a2 = A::getClassA();
- echo "$a1 のクラスは ".get_class($a1)." 、$a2 は ".get_class($a1) ;
- if($ a1 === $a2){
- echo "
$a1 $a2 は同じオブジェクトを指します。";
- }else{
- echo "
$a1 $a2 はobject.";
- }
- ? >
-
コードをコピーします
プログラムの実行結果は次のとおりです。
$a1 のクラスは A 、 $a2 は A
$a1 $a2 は同じオブジェクトを指します。
この時点で、最も単純なシングルトン パターンを作成しました。
ここで、シングルトン設計パターンを適用するデータベース接続クラスの作成を試みることができます。
シングルトンパターンの使い方と書き方を覚えておきましょう。
|