是否可以在类__construct()魔术方法中设置或定义一个后来无法更改的值?
我想知道它是否更好的可读性和脚本注入攻击的情况下,像客户角色和数据库信用等一些值可以像类常量一样修复。只有在这种情况下,才能在登录后定义客户角色甚至数据库信用额度。
答案 0 :(得分:1)
不,在语言层面是不可能的。 An RFC submitted in late 2014建议添加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
这不是很容易测试,但它实现了“只能设置一次,之后永不可修改”的目标。