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


Set or define a value in constructor that cannot be changed afterwards (during runtime)

是否可以在类__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

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