使用神奇的方法将类方法视为属性,反之亦然

时间:2018-02-03 19:49:51

标签: php laravel

让我们考虑一下这个Product模型:

class Product extends Model
{
    public function category() {
        $this->belongsTo(Category::clas);
    }
}

有了Laravel,我有可能:

  1. 通过执行

    获取Query Builder的实例
    $product = Product::first();
    $builder = $product->category()
    
  2. 通过执行

    获取类别的实例
    $product = Product::first();
    $category = $product->category
    
  3. 我知道这种获取查询生成器或类别的实例的方式纯粹是PHP

    经过一些研究,我发现了__call()方法,所以我用它如下:

    class Cart
    {
        public function __call($method, $args) {
            if($method) {
                return true;
            }
            return false;
        }
    }
    

    但我无法做到这一点:

    $cart = new Cart();
    $cart->items
    

    如何管理我的班级才能$cart->items$cart->items()

1 个答案:

答案 0 :(得分:2)

这是使用magic methods

完成的
class Cart
{
    public function __get($name)
    {
        return "$name property";
    }

    public function __call($name, $arguments)
    {
        return "$name method";
    }
}

$cart = new Cart;

var_dump($cart->items); // => string(14) "items property"
var_dump($cart->items()); // => string(12) "items method"

这是the demo

关于Laravel模型,您可以覆盖__get方法,但一定要在逻辑后添加父方法调用:

public function __get($name)
{
    if ($name === 'items') {
        // You logic here with an early return.
    }

    return parent::__get($name);
}