В PHP 7 добавлена поддержка анонимные занятия, однако я не могу найти какую-либо информацию, касающуюся связанных с этим проблем. Я знаю, что могу использовать use
ключевое слово с callables / closures для доступа к переменным внешней области (например, function() use ($outer) { // do work with $outer }
), есть ли способ сделать это с анонимным классом?
Я хотел бы иметь возможность сделать это, не полагаясь на аргументы анонимного конструктора класса, и не делая таких вещей, как добавление метода setter или открытого свойства для хранения значения после создания экземпляра.
Вот пример:
$outer = 'something';
$instance = new class {
public function testing() {
var_dump($outer); // would like this to dump the string 'something'
}
};
другое решение может быть
$outer = 'something';
$instance = new class($outer) {
private $outer;
public function __construct($outer) {
$this->outer = $outer
}
public function testing() {
var_dump($this->outer);
}
};
http://php.net/manual/en/language.variables.scope.php
В документации области видимости переменных php есть несколько инструкций.
Этот сценарий не будет выдавать никаких выходных данных, поскольку оператор echo ссылается на локальную версию переменной $ a, и ему не было присвоено значение в этой области. Вы можете заметить, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны для функций, если они специально не переопределены локальным определением. Это может вызвать некоторые проблемы в том, что люди могут случайно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.
В php область действия, к которой может получить доступ метод внутри класса, ограничена внутренней частью всего класса и недоступна для других областей. Поэтому я думаю, что нужный вам эффект не реализован в php, по крайней мере, пока PHP GROUP не решит изменить поведение PHP по умолчанию.
Конечно, вы все равно можете использовать его, объявив переменные глобальными.
Единственный способ получить доступ к внешним переменным в этом случае — использовать $ _GLOBAL (я не рекомендую). Если вы не хотите использовать метод конструктора или метода установки, я предлагаю использовать переменную STATIC внутри анонимного класса и установить значение после присвоения переменной, содержащей экземпляр анонимного класса (определить статическое значение невозможно) раньше, потому что класс анонимный ..). Делая это, вы получаете лучший элемент управления и статическую переменную, но определенным образом это не очень обычно, каждый раз, когда вы создаете новый анонимный класс, экземпляр и его значения принадлежат VARIABLE, который получает «новый объект», возможно, Вам лучше создать реальный класс. Но следуйте примеру со статическим значением и анонимным классом:
$i = new class {
public static $foo;
};
var_dump($i::$foo); //No value
$i::$foo = "Some value";
var_dump($i::$foo); //Has value
Надеюсь, поможет!