在构造函数中设置或定义之后无法更改的值(在运行时期间)

时间:2016-06-28 15:06:13

标签: php oop

是否可以在类__construct()魔术方法中设置或定义一个后来无法更改的值?

我想知道它是否更好的可读性和脚本注入攻击的情况下,像客户角色和数据库信用等一些值可以像类常量一样修复。只有在这种情况下,才能在登录后定义客户角色甚至数据库信用额度。

1 个答案:

答案 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;
}

Another way

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

这不是很容易测试,但它实现了“只能设置一次,之后永不可修改”的目标。