首页 > 解决方案 > 类方法调用中的 php 闭包

问题描述

假设我有两个班级 Car 和 Owner

所有者.php =>

class Owner {
  public $name;

  public function setName($name) {
    $this->name = $name;
  }
}

分别是 car.php =>

class Car {
  public $owner;

  public function setOwner(Owner $owner) {
    $this->owner = $owner;
  }
}

要设置和调用方法,我通常使用这种方法 =>

$owner = new Owner;
$owner->setName('sam');


$car = new Car;
$car->setOwner($owner);

但是,如果我希望它使用像下面这样的 Closure 来做,我该如何相应地更改 setOwner 方法呢?

$car = new Car;
$car->setOwner(function(Owner $owner) {

  $owner->setName('sam');
});

我想做的是类似于 Laravel 的东西where

User::where('car_id', $carId)

or 


User::where(function($query) {

  //code here 
})

标签: phpclosures

解决方案


Car::setOwner()需要用一个Owner对象调用它的参数。

class Car {

  public function setOwner(Callable $ownerSetter) {
    $o = new Owner;
    $ownerSetter($o);
  }
}

但这是使用闭包的一种奇怪方式。一个更好的例子可能是:

class Car {
  private $owner;

  public function setOwner($owner) {
    $this->owner = $owner;
  }

  public function doSomethingToOwner(Callable $something) {
    $something($this->owner);
  }
}

$car->setOwner($owner);
$car->doSomethingToOwner(function($owner) {
  echo $owner->name;
});

推荐阅读