【问题标题】:PHP - self, static or $this in callback functionPHP - 回调函数中的 self、static 或 $this
【发布时间】:2012-03-15 19:41:32
【问题描述】:

是否可以在 PHP 的匿名回调中访问引用为 selfstatic$this 的类/对象?就像这样:

class Foo {
    const BAZ = 5;
    public static function bar() {
         echo self::BAZ; // it works OK
         array_filter(array(1,3,5), function($number) /* use(self) */ {
             return $number !== self::BAZ; // I cannot access self from here
         });
    }
}

有没有什么方法可以使用use(self) 子句使其与通常的变量一样工作?

【问题讨论】:

标签: php static callback anonymous-function self


【解决方案1】:

使用 PHP5.4 会是这样。目前是不可能的。但是,如果您只需要访问公共属性,方法

$that = $this;
function () use ($that) { echo $that->doSomething(); }

对于常量,没有理由使用限定名

function () { echo Classname::FOO; }

【讨论】:

  • 感谢您的回答。但是,如果我需要替换 static::FOO,即后期绑定,则无法使用 Classname。
  • 听起来你更多的是寻找类属性(又名静态属性),而不是常量。但是,对于我回答中的第一个示例,您应该能够调用像$that::FOO 这样的常量。
  • 实际上,我认为通过后期绑定来做 OP 想要的事情不是这样:$that=static::FOO;
  • @Tim 闭包不是对象(实际上它们是,但这更多的是实现细节,不应该关心你),所以没有staticself,但最后一个可以很容易用具体的类名替换。 static 的用途非常有限,如果你真的需要它,你应该三思而后行。
  • 我想你误解了我想说的话。我明白你所说的一切。我指出您对 OP 请求后期静态绑定的响应不起作用。解决方案是将您的第一个代码块的第一行替换为 $that=static::FOO;这将在闭包创建点提供后期静态绑定,这是 php 5.3 中最好的方法
【解决方案2】:

只需使用标准方式:

Foo::BAZ;

$baz = self::BAZ;
... function($number) use($baz) {
   $baz;
}

【讨论】:

    【解决方案3】:

    这个呢:

    class Foo {
        const BAZ = 5;
        $self = __class__;
        public static function bar() {
             echo self::BAZ; // it works OK
             array_filter(array(1,3,5), function($number) use($self) {
                 return $number !== $self::BAZ; // access to self, just your const must be public
             });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 2012-01-07
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多