Как сделать окончательную переменную в PHP?

Я не могу узнать, или, возможно, я ошибаюсь, но мне нужно создать переменную, которая не может быть изменена, например, только для чтения, что-то вроде:

final $finalVar = 'extremely secret number'; // don't change

$finalVar = 'hacked...'; // THROW I GIANT BIG ERROR HERE !

3

Решение

Помимо констант (как уже упоминалось в комментариях), единственный способ, которым я могу придумать, — это использовать отношения родитель-ребенок с 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 родительская переменная из дочернего класса

2

Другие решения

Хотя там было говорить переменных, доступных только для чтения, по крайней мере с 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"
1

По вопросам рекламы [email protected]