【问题标题】:Php closure in a class method call类方法调用中的 php 闭包
【发布时间】:2020-05-11 11:08:20
【问题描述】:

假设我有两个类 Car 和 Owner

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);

但是如果我希望它使用下面的闭包来完成,我该如何相应地更改 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 
})

【问题讨论】:

  • 这应该如何工作? Car 怎么知道要设置哪个Owner 的名字?
  • 为什么汽车要设置车主的名字呢?
  • Car::setOwner() 需要使用 Owner 参数调用闭包。如果您不使用setOwner() 来指定拥有它的所有者,那会从哪里来?
  • 也许你想要的是两种方法:setOwnersetOwnersName。第二种方法将使用$this->owner
  • 我刚刚创建了这个作为示例,我想知道如何在 Closure 中设置值并在方法中获取该对象。

标签: php closures


【解决方案1】:

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

【讨论】:

  • 硬耦合汽车及其所有者实例似乎是个坏主意。我知道您正在完全按照所要求的方式回答问题,但指出不完全推荐它可能是相关的。您也可以选择this(不将两者耦合),但同样,与 OP 最初的相比,这并没有提供任何好处。
  • 我试图在 cmets 中获得更多细节,但他说这只是一个简单的例子。他只是想看看数据是如何流动的。
  • 我添加了一种更有用的方法来使用闭包。
  • @Barmar 我的想法是将功能 setOwner 和 doSomethingToOwner 合二为一。我想我会检查它是否是可调用的并每天收工。
  • @menaka 但是您想将所有者设置为什么?您需要将新所有者作为参数提供给该方法。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2015-05-16
  • 2020-03-11
  • 2012-11-05
  • 2010-11-26
相关资源
最近更新 更多