Доступ к внешней переменной в анонимном классе PHP 7

В 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'
}
};

11

Решение

другое решение может быть

$outer = 'something';

$instance = new class($outer) {

private $outer;

public function __construct($outer) {
$this->outer = $outer
}

public function testing() {
var_dump($this->outer);
}
};
3

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

http://php.net/manual/en/language.variables.scope.php

В документации области видимости переменных php есть несколько инструкций.

Этот сценарий не будет выдавать никаких выходных данных, поскольку оператор echo ссылается на локальную версию переменной $ a, и ему не было присвоено значение в этой области. Вы можете заметить, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны для функций, если они специально не переопределены локальным определением. Это может вызвать некоторые проблемы в том, что люди могут случайно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.

В php область действия, к которой может получить доступ метод внутри класса, ограничена внутренней частью всего класса и недоступна для других областей. Поэтому я думаю, что нужный вам эффект не реализован в php, по крайней мере, пока PHP GROUP не решит изменить поведение PHP по умолчанию.

Конечно, вы все равно можете использовать его, объявив переменные глобальными.

1

Единственный способ получить доступ к внешним переменным в этом случае — использовать $ _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

Надеюсь, поможет!

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector