Php 如何在方法中定义的匿名函数中使用`self:::`访问类常量?
我想从匿名函数中使用Php 如何在方法中定义的匿名函数中使用`self:::`访问类常量?,php,anonymous-function,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
访问类常量
class My_Class {
const CLASS_CONSTANT = 'test value';
private function my_function(){
$lambda_function = function(){
echo self::CLASS_CONSTANT;
};
$lambda_function();
}
}
当我尝试此操作时,我得到错误:
致命错误:在中没有活动的类作用域时无法访问self::
是否可以将父类传递到此匿名函数的作用域中?
使用
语句有效吗?如果在匿名函数中访问self,这将不起作用。您应该做的是使用My_Class::Class_CONSTANT
而不是自引用。afaik匿名函数就是这样。。功能。不是类方法,所以范围不在范围之内。您可以将常量作为参数传递,也可以使用My_Class::Class_常量。不,这是不可能的。同样,不能将$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'
>所有版本都在3v4l私有函数my_function()use($any_variable){…}
上测试PHP5.4+方式,显然,它适用于除$this
之外的任何变量。为什么它不能与$this
一起使用呢?因为PHP的开发人员很难正确地实现它。不过,它在即将发布的PHP版本(5.4.0)中可用。如果您不想通过名称引用该类,可以使用magic常量\uuuuuuu class\uuuuuuu
,它可以有效地取代您在lambda函数中对self
的需求“我可能会用它。不过需要两行<代码>$class\u name=\uuuu class\uuuu$class_name::class_常量因为\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu代码>不起作用。旁注:没有什么可以阻止您将$this变量传递到匿名函数的“use”部分。您只需要将其分配给中介变量,比如$that=$this,然后函数()use($that){}将引用当前对象。在匿名类中调用静态方法(如static::Func())怎么样?(是的My_Class::Func()
可以工作,但这不是重点)静态函数的$this等价物是什么?您可以调用$self::Func()
,即使它是受保护的或私有的,因为您从类本身的上下文调用它。但我不是绝对肯定。。。试试看$object::static()
是您的朋友。在PHP5.5中,可以在匿名函数中使用self
,而无需使用use
关键字
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();
}
}
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 $
}
}