在PHP 7匿名类中访问外部变量

bru*_*ski 18 php

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)

  • @AntoineMarques 他们太忙于改变生活的进步,比如弃用“<?” 标签来解决与 XML 语法的冲突,众所周知,XML 语法每天都让世界各地的开发人员感到烦恼。箭头函数、简洁的外部作用域变量访问或 21 世纪的类型方案等不太好的功能并不那么重要。 (3认同)

小智 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)

希望能帮助到你!