在扩展的mysqli类中设置公共属性


Set public property within extended mysqli class

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

有正确的方法吗?提前谢谢。

如注释中所述,将其指定为静态属性会使该属性属于该类,而不是该类对象的实例。若要访问类属性,必须使用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);
     }
 }