PHP子类方法内部函数如何访问父类静态变量?
解决子类内部函数访问父类静态变量的问题
你碰到的这个错误其实很好理解:你在test()方法里定义的innerFuntion是个全局普通函数,它完全脱离了类的方法作用域,根本不知道parent是什么——parent关键字只能在类的成员方法里使用,全局函数里没有这个上下文,所以才会报“找不到parent类”的错误。
下面给你几个可行的解决办法:
方法一:用闭包捕获外部变量
把普通函数改成闭包,先把父类的静态变量存到test()方法的局部变量里,再通过use关键字让闭包捕获这个变量:
public function test() { // 先将父类静态变量赋值给局部变量 $dbConnection = parent::$mysqli; // 定义闭包并捕获$dbConnection $innerFunction = function() use ($dbConnection) { $query = 'some query'; $dbConnection->query($query); }; $innerFunction(); }
方法二:直接用父类完整类名访问静态变量
因为静态变量属于类本身,只要你知道父类的类名,就能直接访问(这里$mysqli是protected权限,子类范围内可以正常访问):
public function test() { $innerFunction = function() { $query = 'some query'; // 直接通过父类类名访问静态变量 CsBuilder::$mysqli->query($query); }; $innerFunction(); }
方法三:动态获取父类名称(避免硬编码类名)
如果担心以后父类名称会修改,可以先获取父类的类名,再让闭包捕获这个变量:
public function test() { // 动态获取父类类名 $parentClassName = parent::class; $innerFunction = function() use ($parentClassName) { $query = 'some query'; $parentClassName::$mysqli->query($query); }; $innerFunction(); }
额外注意点
- 别再用普通函数(
function innerFunction(){})的方式定义内部函数了,这种函数会被PHP自动提升到全局作用域,和你的类方法完全无关,自然访问不了类的任何成员。 - 一定要确保
CsBuilder::initialise()已经正确初始化了$mysqli静态变量,不然即使能访问到,调用query()时也会因为变量是初始值0而报错。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

