静态和非静态调用方法,工作和不工作

时间:2018-01-19 14:18:11

标签: php

此代码可以正常工作:

<?php

class Test {

    public function hi($data) {
        $instance = !(isset($this) && $this instanceof self) ? new static() : $this;
        echo "HI!!! ".$data."\n";
        return $instance;
    }

    public function log($data) {
        $instance = !(isset($this) && $this instanceof self) ? new static() : $this;
        echo "Log: ".$data."\n";
        return $instance;
    }
}

Test::log("HI THERE!");
(new Test())->log("how are you?");

Test::hi("1")->hi("2");
(new Test())->hi("3")->hi("4");

返回:

Log: HI THERE!
Log: how are you?
HI!!! 1
HI!!! 2
HI!!! 3
HI!!! 4

但是这个没有:

class AL extends Model
{

    public function event($verb, $data = [])
    {
        $static = !(isset($this) && $this instanceof self);
        $instance = $static ? new static([ 'verb' => $verb ]) : $this;

        if(!empty($data)) $instance->data($data);

        $instance->save();
        return $instance;
    }

致电:

    AL::event($verb, $product);

失败了,回来了:

  

[ErrorException]

     

非静态方法App \ Model \ AL :: event()不应静态调用

我正在使用:

PHP version: PHP Version => 7.1.8-2+ubuntu16.04.1+deb.sury.org+4

两个调用之间的唯一区别是我第一个调用php test.php,第二个调用Laravel的artisan命令行界面。

¿造成不一致的原因是什么?

1 个答案:

答案 0 :(得分:2)

从官方PHP文档:

  

警告在PHP 7中,不推荐静态调用非静态方法,并会生成 E_DEPRECATED 警告。将来可能会删除对静态调用非静态方法的支持。

     

PHP: Static Keyword,强调原创

这意味着可以静态调用非静态函数,但php会发出通知。然而,这里注意到这被转换为ErrorException(很可能是由父Model类),导致代码的执行停止。由于您的第一个示例并未从类Model扩展,因此它仍然可以正常工作。