我想在匿名函数中使用self
访问类常量。
class My_Class {
const CLASS_CONSTANT = 'test value';
private function my_function(){
$lambda_function = function(){
echo self::CLASS_CONSTANT;
};
$lambda_function();
}
}
当我尝试这个时,我收到错误:
致命错误:当......中没有活动类范围时,无法访问self ::
是否可以将父类传递到此匿名函数的范围内? use
声明是否有效?
答案 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'