如何在方法中定义的匿名函数内使用`self ::`访问类常量?

时间:2011-11-23 14:31:39

标签: php anonymous-function

我想在匿名函数中使用self访问类常量。

class My_Class {    
    const  CLASS_CONSTANT = 'test value';
    private function my_function(){     
        $lambda_function = function(){
            echo self::CLASS_CONSTANT;
        };
        $lambda_function();
    }
}

当我尝试这个时,我收到错误:

  

致命错误:当......中没有活动类范围时,无法访问self ::

是否可以将父类传递到此匿名函数的范围内? use声明是否有效?

4 个答案:

答案 0 :(得分:11)

>> All versions test of PHP 5.4+ way on 3v4l <<

PHP 5.4+ WAY:

自PHP 5.4起,这变得非常简单,其中$this不再是脏的:

class My_Class {
    const CLASS_CONSTANT = 'test value';

    private function my_function() {
        $lambda_function = function() {
            // $this is actually inherited from the parent object, so
            // you don't even need a use() statement
            echo $this::CLASS_CONSTANT;

            // Or just use self, that's inherited too
            echo self::CLASS_CONSTANT;
        };
        $lambda_function();
    }
}

PRE 5.4 WAY:

使匿名函数成为闭包 - 通过将作用域变量引入函数 - 并从中调用常量:

class My_Class {
    const CLASS_CONSTANT = 'test value';
    private function my_function() {
        $self = $this;
        $lambda_function = function() use ($self) { // now it's a closure
            echo $self::CLASS_CONSTANT;
        } // << you forgot a ;
        lambda_function(); // << you forgot a $
    }
}

不幸的是你不能use ($this) YET。他们正在努力。我希望它能用于PHP&gt; = 5.4。

答案 1 :(得分:8)

afaik匿名函数只是..函数。不是类方法,因此范围不大。您可以将常量作为参数传递或使用My_Class :: CLASS_CONSTANT。

答案 2 :(得分:1)

您正在访问匿名函数中的self,这不起作用。你应该做的是使用My_Class::CLASS_CONSTANT而不是自我引用。

答案 3 :(得分:1)

不,那是不可能的。同样,您不能将$ this绑定到匿名函数。只是传递必要的值而不应该这样做?

<?php
class My_Class {
    const  CLASS_CONSTANT = 'test value';
    private function my_function(){     
        $lambda = function( $yourConstant ){
            return $yourConstant;
        };

        return $lambda( self::CLASS_CONSTANT );
    }

    public function test( ) {
        return $this->my_function( );
    }
}

$class = new My_Class( );
echo $class->test( ); // 'test value'