是否可以在类__construct()魔术方法中设置或定义一个值,之后不能更改?
我想知道它是否更好的可读性,并在脚本注入攻击的情况下,一些值,如客户角色和数据库凭证可以像类常量一样固定。只有在这种情况下,客户角色甚至db凭据才会在登录后定义。
不,这在语言水平上是不可能的。2014年底提交的一份RFC建议添加一个readonly
关键字,使属性对消费者来说是不可变的。RFC是这么说的:
目前还没有办法让一个属性对所有人都可读,而只对包含它的对象可写,PHP的可见性说明符允许全部或不允许:一个作用域可以既读又写,或者什么都不做。虽然__get和__set存在,但它们实际上不允许控制相同的属性,仅仅是暴露一个单独的属性,并且它们仅用于未声明的属性,这些属性不能反映并且不具有性能。
尽管如此,您可以使用一些开发模式来实现这种效果,例如创建一个值对象来保存所需的数据,数据本身在private
属性中,只有"getter"方法。例子:
class Credentials {
public function __construct($credentials) {
$this->credentials = $credentials;
}
public function getCredentials() {
return $this->credentials;
}
private $credentials;
}
的另一种方法:
function credentials($initial = null) {
static $credentials = null;
if (null === $credentials) {
if (empty($initial)) {
throw new 'LogicException('Need to initialize credentials');
} else {
$credentials = $initial;
}
}
return $credentials;
}
echo credentials('first time'); // sets and returns value
echo credentials(); // always returns initial set value
echo credentials('second time'); // still echoes initial value
这不是很容易测试,但它实现了"只能设置一次,以后永远不可修改"的目标。