Laravel - 创建可以静态和非静态调用的方法

时间:2014-04-14 15:16:27

标签: php laravel eloquent

我想在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

2 个答案:

答案 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);
}

像这样,您可以使用非静态方法的语法调用每个静态方法。