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