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'
}
};
Run Code Online (Sandbox Code Playgroud)
小智 17
另一个解决方案可能是
$outer = 'something';
$instance = new class($outer) {
private $outer;
public function __construct($outer) {
$this->outer = $outer
}
public function testing() {
var_dump($this->outer);
}
};
Run Code Online (Sandbox Code Playgroud)
小智 7
在这种情况下访问外部变量的独特方法是使用 $_GLOBAL(我不推荐)。如果你不想使用构造函数或setter方法,我的建议是在匿名类内部使用一个STATIC变量,并将属性后的值设置为包含匿名类实例的变量(它不可能定义静态值之前,因为该类是匿名的..)。这样做,你有一个更好的控制和一个静态变量,但在某种程度上这不是很常见,每次当你创建一个新的匿名类时,实例和它的值都属于接收“新对象”的变量,也许更适合您创建一个真正的类..但是请遵循带有静态值和匿名类的示例:
$i = new class {
public static $foo;
};
var_dump($i::$foo); //No value
$i::$foo = "Some value";
var_dump($i::$foo); //Has value
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!