此代码可以正常工作:
<?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命令行界面。
¿造成不一致的原因是什么?
答案 0 :(得分:2)
从官方PHP文档:
警告在PHP 7中,不推荐静态调用非静态方法,并会生成 E_DEPRECATED 警告。将来可能会删除对静态调用非静态方法的支持。
PHP: Static Keyword,强调原创
这意味着可以静态调用非静态函数,但php会发出通知。然而,这里注意到这被转换为ErrorException
(很可能是由父Model
类),导致代码的执行停止。由于您的第一个示例并未从类Model
扩展,因此它仍然可以正常工作。