我无法找到,或者我错误地思考但是我需要创建一个无法更改的变量,例如只读:
final $finalVar = 'extremely secret number'; // don't change
$finalVar = 'hacked...'; // THROW I GIANT BIG ERROR HERE !
答案 0 :(得分:2)
除了常量(如评论中所述),我能想到的唯一方法是使用具有private
变量的父子关系
class ParentC {
private $var = 'bob';
}
class ChildC extends ParentC {
public function setVar() {
// Fatal error: Uncaught Error: Cannot access private property ParentC::$var
echo parent::$var;
}
}
请注意,a hacky way around that使用Reflection类。但是,在大多数情况下,您无法触及子类的private
父变量
答案 1 :(得分:1)
虽然至少从2012年开始有talk个只读变量,即使有RFC在对象上提出它,但该语言中不存在支持。
实现只读变量(或只读变量的集合,对于某些配置值可能很重要)的一种方法是使用中介容器:
class Readonly {
public function __construct(...$vars) {
$this->vars;
}
public function __set($var, $value) {
if (array_key_exists($var, $this->vars)) {
throw new \LogicException("Variable $var is read-only");
} else {
$this->vars[$var] = $value;
}
}
public function __get($var) {
return array_key_exists($var, $this->vars) ? $this->vars[$var] : null;
}
protected $vars = [];
}
允许您创建只读变量的容器:
$config = new Readonly('apikey');
$config->apikey = 'A01AB020'; // this works, first time set
echo $config->apikey;
$config->apikey = '00000000'; // boom! it's "final"
答案 2 :(得分:1)
如果要创建不想更改的变量,可以使用常量:
class MyClass {
const VERSION = '2.1'; // This constant can be view outside the class,
// but its value can't be changed even in this class
function myMethod () {
echo self::VERSION; // Inside class
}
}
或在课堂外:
echo MyClass::VERSION;
功能方法:
define ('VERSION', '2.1');
echo VERSION;
答案 3 :(得分:0)