Я не могу узнать, или, возможно, я ошибаюсь, но мне нужно создать переменную, которая не может быть изменена, например, только для чтения, что-то вроде:
final $finalVar = 'extremely secret number'; // don't change
$finalVar = 'hacked...'; // THROW I GIANT BIG ERROR HERE !
Помимо констант (как уже упоминалось в комментариях), единственный способ, которым я могу придумать, — это использовать отношения родитель-ребенок с 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;
}
}
Обратите внимание, что есть хакерский способ обойти это используя класс Reflection. Но, по большей части, вы не можете коснуться private
родительская переменная из дочернего класса
Хотя там было говорить переменных, доступных только для чтения, по крайней мере с 2012 года, причем даже 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"