扩展口才模型似乎是thing人所做的。我有一个有趣的问题:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class FooBase extends Model {
protected $table = 'foo_bar';
}
namespace App\Models;
class FooExtends extends FooBase {
public function method() {
return FooBase::first(); // or even parent::first()
}
}
调用(new FooExtends())->method()
返回FooExtends
而不是FooBase
的实例。 (只是静态方法受到影响,这可能会回答我自己的问题,但是有人会认为Laravel会解决这个问题。从子类内部调用(new FooBase())->first()
可以正常工作。)这是怎么回事?
PHP 7.3,Laravel 5.7
答案 0 :(得分:1)
这是doesn't apply static context when calling an ancestor class的一个非常有趣的PHP怪癖。
基本上,对FooBase::first()
的“静态”调用的解释与parent::first()
相同,因为PHP知道FooBase
是当前类上下文FooExtends
的父级。并且由于对parent
的调用保留在当前对象的上下文中,因此first()
调用最终被路由到__call()
而不是__callStatic()
(这将使用FooBase
类)。
了解PHP内部和类上下文真的很有趣。谢谢你给我一个理由。 :)