当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);
}
}