1

当this在另一个上下文中并且self只需要静态道具时如何设置公共变量的值,在实例化后似乎无法访问。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;

更新

查看您遇到的问题,我认为您只是试图提供对可以扩展的共享数据库对象的全局访问。如果是这种情况,您可能会通过为 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 回答