web-dev-qa-db-ja.com

PHPで特定のクラスのインスタンスを取得する方法

存在する _class_A_のインスタンスがあるかどうか、そして存在する場合getそのインスタンスがあるかどうかを確認する必要があります。

PHPでそれを行う方法?

いつものように、私は単純な例が最良だと思います。

現在私の問題は次のようになりました:

_$ins = new class_A();
_

インスタンス化時にインスタンスを_class_A_の静的メンバー変数に格納する方法は?

__construct()を呼び出すときにインスタンスを保存できれば、さらに良いでしょう。つまり、インスタンス化の方法に制限なく機能するはずです。

15
user198729

あなたが説明したのは本質的にシングルトンパターンです。 この質問を参照してください なぜこれを望まないのかという正当な理由があります。

あなたが本当にそれをしたいのであれば、次のようなものを実装することができます:

class a {
    public static $instance;
    public function __construct() {
        self::$instance = $this;
    }

    public static function get() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

$a = a::get();
32
Tom Haigh

あなたが求めることは不可能です(まあ、おそらく技術的な意味ではないかもしれませんが、非常に非現実的です)。オブジェクトとクラスの目的について、より深い誤解があることを示しています。

7
troelskn

シングルトンパターンを実装する必要があります。 http://www.developertutorials.com/tutorials/php/php-singleton-design-pattern-050729/page1.html

4
Pikrass

たぶんあなたは何かのようなものが欲しい

for (get_defined_vars() as $key=>$value)
{
  if ($value instanceof class_A)
    return $value;
}

編集:さらに読むと、オブジェクト参照を取得するためにいくつかのフープをジャンプする必要があります。だからあなたはreturn $$key; の代わりに return $value;。または、オブジェクトへの参照を取得するための他のいくつかのトリック。

4
Dathan

シングルトンパターン WikipediaのPHPの例 に「checkExists」メソッドを追加しました。クラスが存在するかどうかを確認する必要があるようです。終了しない:

final class Singleton 
{
    protected static $_instance;

    protected function __construct() # we don't permit an explicit call of the constructor! (like $v = new Singleton())
    { }

    protected function __clone() # we don't permit cloning the singleton (like $x = clone $v)
    { }

    public static function getInstance() 
    {
      if( self::$_instance === NULL ) {
        self::$_instance = new self();
      }
      return self::$_instance;
    }

    public static function checkExists() 
    {
      return self::$_instance;
    }
}

if(Singleton::checkExists())
   $instance = Singleton::getInstance();
2
Karl B
1
Pekka 웃

あなたが望むのは Registry Pattern だと思います

1
AntonioCS

Pikrassの回答を拡張するには、基本的に次のようなことを行います。

class class_A {
  private static $instance = false;

  public static function getInstance() {
    if (!self::$instance) {
      self::$instance = new class_A();
    }

    return self::$instance;
  }

  // actual class implementation goes here
}


// where you need to use the instance:
$mySingleton = class_A::getInstance();
// do something with $mySingleton
1
Aistina

シングルトンを使用することで、基本的に大きな グローバル変数 が作成されることに注意してください。状態が変化すると、コードが予測不能になる可能性があります。したがって、注意してください。

0
JW.

以下のコードには、効率を向上させるキャッシング品質があります。

class Object {

  public $instance_variable;
  public $last_added_global_variable;

  public function __construct(){
    //we are saving the global variable before this one so that
    //we can be confident that we will always get the correct value
    $this->last_added_global_variable = $this->get_last_variable_added()[count($array_of_global_variables)-1];
  }

  //runs everytime a function is called in this class
  public function __call(){
    //remember, this is skipped whenever the variable name is saved
    if(!$this->instance_variable){
      for($i=0; $i=count($this->get_last_variable_added()); $i++){
        if($this->last_added_global_variable == get_last_variable_added()[$i]){
          $this->instance_variable = get_last_variable_added()[$i+1];
        }
      }
    }
  }

  private function get_last_variable_added(){
    $array_of_global_variables = array();

    foreach($GLOBALS as $g=>$v){
      array_Push($array_of_global_variables, $g);
    }

    //return last added global variable
    return $array_of_global_variables;
  }

}

高価に見えますが、それはごくわずかです。

グローバル変数ループを介して最後に追加された変数を見つけることは、まだ構築関数内にいる間は不可能であることに注意するかもしれません。

0

ファイル内のシングルトンインスタンス化命令の置き換えが問題である場合は、定数駆動型の動作に変わる可能性があります。定数はスクリプトのすべての期間に適用されるため、要件が一意である必要がある場合(すべての場合)スクリプトの継続時間)構築メソッドは、定数の存在/値に適切にリンクされている場合があります。

 class superObject {
 public function __construct(){
 if(defined( 'SUPER_OBJECT')){
 trigger_error( 'Super object' .__ CLASS__。 'すでにインスタンス化された '、E_USER_ERROR); 
 // ...またはインスタンスがオーバーラップした場合に何でもしたい
} else {
 define(' SUPER_OBJECT '、true) ; 
} 
 //残りの構成メソッド
 // ... 
} 
} 
0