我想在User模型中创建一个方法,当静态或非静态调用时,该方法的行为会有所不同。 基本上它应该这样做:
public function foo() {
// based on http://stackoverflow.com/questions/3824143/how-can-i-tell-if-a-function-is-being-called-statically-in-php
if(isset($this) && get_class($this) == __CLASS__) {
$static = true;
} else {
$static = false;
}
if($static)
$user = Auth::user();
else
$user = $this;
// Do stuff with the user
return $user->bar;
// ...
}
但它给了我错误:
Non-static method User::foo() should not be called statically, assuming $this from incompatible context
。
答案 0 :(得分:1)
不可以两次定义相同的方法;静态和非静态地。
但是,您可以使用魔术方法__call
和__callStatic
来实现这一目标
class User {
public function __call($method, $args) {
if (method_exists($this, 'instance_' . $method)) {
return call_user_func_array([$this, 'instance_' . $method], $args);
}
}
public static function __callStatic($method, $args) {
if (method_exists(__CLASS__, 'static_' . $method)) {
return call_user_func_array([__CLASS__, 'static_' . $method], $args);
}
}
}
这会将对$user->fn()
和User::fn()
的通话传递给$user->instance_fn()
和User::static_fn()
。
答案 1 :(得分:0)
基本上:
您可以从非静态方法调用静态方法,反之亦然。
所以你也可以使用这样的魔术方法:
public function __call($method, $args)
{
return call_user_func(get_class_name($this) .'::'. $method, $args);
}
像这样,您可以使用非静态方法的语法调用每个静态方法。