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

时间:2013-08-14 21:24:56

标签: php class mysqli extend

如何在另一个上下文中 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

有没有正确的方法呢?提前谢谢。

1 个答案:

答案 0 :(得分: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);
     }
 }