PHP类中为何可通过$this->default读取$_default?哪种写法更推荐?
关于PHP类中属性访问的疑问解答
嘿,这个问题问到点子上了!我来给你理清楚这里的门道~
首先得纠正一个点:你贴出来的这段代码,如果直接运行的话,其实是会报错的!因为PHP对属性名是严格区分的,$_default和default是完全不同的两个属性——前者带下划线前缀,后者没有。那为什么你见过的一些示例里能通过$this->default访问到$_default呢?
答案几乎肯定是:那些示例的类里偷偷实现了**__get()魔术方法**!这个魔术方法的作用是,当你尝试访问一个不存在或者不可访问的属性时,PHP会自动调用它。举个例子,那些类里可能有这样的代码:
public function __get($propertyName) { // 当访问$default时,返回内部的$_default属性 if ($propertyName === 'default') { return $this->_default; } // 其他属性的处理逻辑... }
正是这个魔术方法在背后做了映射,才让你看起来像是直接用$this->default拿到了$_default的值。
哪种写法更推荐?
- 标准优先写法:直接用
$this->_default:这是最符合PHP语法规范的做法,属性名是什么就直接访问什么,代码清晰无歧义,而且不需要触发魔术方法,性能也更好。 $this->default的写法:只有在类里有__get方法支持时才能生效,这种写法一般是为了封装需求——比如内部用带下划线的属性标记“内部使用”,对外用更简洁的名字暴露。但如果没有魔术方法兜底,这种写法会直接抛出Undefined property的错误,非常容易踩坑。
总结一下:如果没有特殊的封装需求,优先选择$this->_default的直接访问方式。要是想对外提供友好的访问接口,更推荐写专门的getter方法(比如getDefault()),比依赖魔术方法的写法更直观,也更容易维护。
内容的提问来源于stack exchange,提问作者carry0987
相关产品推荐
相关产品推荐

