PHP的时候没有对象上下文使用$此(PHP using $this when not in obje

2019-10-21 10:25发布

我有以下类:

class Decode {
    public $code;
    public $codeStore;
    public $store;
    public $varName;
    public $storeNew = array();
    public $storeNew = array();

    public function __construct($code) {
        $this->code = $code;
        $this->codeStore = $code;
        $this->varName = substr($this->code, 0, 30);
        $this->varName = str_replace("var ", "", $this->varName);
        $this->varName = substr($this->varName, 0, strpos($this->varName, "=[\""));
    }

    public function chrToVar() {
        // The line below is line 38
        $this->code = preg_replace_callback('/'.$this->varName.'\[([0-9]+)\]/', function($matches) { return $this->storeNew[$matches[1]]; }, $this->code);
    }
}

$script = new Decode('stuff');
$script->chrToVar();

当我运行这段代码,我得到以下错误:

致命错误:使用$这在不在线38 /var/www/programs/decode.php对象上下文

这究竟是为什么? 我想它是与已在该函数的参数preg_replace_callback ,但我不知道如何解决它。

Answer 1:

由于PHP 5.4 $this可以在匿名函数一起使用,并且指的是当前对象,简单的例子:

class Decode {
    public $code;

    public function __construct( $code ) {
        $this->code = $code;
    }

    public function chrToVar() {        
        $this->code = preg_replace_callback( '/\w+/', 
            function( $matches ) {              
                var_dump( $this );
            }, $this->code
        );
    }
}

$script = new Decode( 'stuff' );
$script->chrToVar();

对于5.3版本,你可以使用的方法,但它仅与公共属性的工作原理:

$self = $this;
$this->code = preg_replace_callback( '/\w+/', 
    function( $matches ) use ( $self ) {                
        var_dump( $self );
    }, $this->code
);

我的建议是如果可能的话至少升级到5.4。

更多信息: PHP 5.4 - “封$这种支持”



文章来源: PHP using $this when not in object context