1

インスタンス化後にアクセスできないように見える別のコンテキストと自己の静的小道具のみが必要な場合にパブリック変数の値を設定する方法。mysqli 接続には少し拡張があります。

class db extends mysqli {
...
public static $bar;

private function __construct() {

    self::$bar = "test";
...

}

db::setOptions($db_options);
$link = db::getInstance();

echo $link->bar;


Notice: Undefined property: db::$bar in ... blah-blah-blah

それを行う正しい方法はありますか?前もって感謝します。

4

1 に答える 1

0

コメントで述べたように、これを静的プロパティとして指定すると、クラスのオブジェクトのインスタンスではなく、プロパティがクラスに属します。クラス プロパティclassname::$propertyNameにアクセスするには、プロパティへのアクセスに使用する必要があります。

おそらくあなたがしようとしていることは次のとおりです。

class db extends mysqli {

  protected static $instance;
  public $bar;

  private function __construct() {
    $this->bar = "test";
  }

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

$link = db::getInstance();
echo $link->bar;

アップデート

あなたが抱えている問題を見ると、拡張可能な共有 db オブジェクトへのグローバル アクセスを提供しようとしているだけだと思います。その場合は、mysqli インスタンスを拡張するのではなく、ラッパーを提供することでより良いマイレージを得ることができます。これを行う簡単な方法は、内部に格納されたオブジェクトへのすべての未定義のプロパティ アクセスをプロキシするラッパー オブジェクトを作成することです。

 class db {
     protected $db;
     public $bar;
     protected static $instance;

     protected function __construct(){
         $this->db = new mysqli (....);
         $this->bar = "something";
     }

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

     // magic accessor proxy
     public function __get($property){
           return $this->db->$property;
     }

     // magic mutator proxy
     public function __set($property, $value){
           $this->db->$property = $value;
     }

     // magic call function
     public function __call($method, $args){
          return call_user_func_array(array($this->db, $method), $args);
     }

     public function __callStatic($method, $args){
          return call_user_func_array(array(static::getInstance(), $method), $args);
     }
 }
于 2013-08-15T03:29:40.333 に答える