gpt4 book ai didi

php - 返回带有抽象类的新 $this

转载 作者:可可西里 更新时间:2023-11-01 00:39:50 24 4
gpt4 key购买 nike

我发现我的代码有问题,不明白为什么会这样。谁能给我解释一下?

让我们有:

abstract class AbstractThing
{
public function search(...)
{
$ret = false;

$data = $database->query(...);
foreach($data as $values)
{
$item = new $this;
$item->fill_with_values($values);

$ret []= $item;
}

return $ret;
}
}

它按预期工作并在成功搜索时返回对象实例:

class Thing extends AbstractThing
{
// ...
}

$thing = new Thing;
$things = $thing->search(...); // Thing[] on success, false on failure

但如果我想稍微缩短代码,它就会中断:

abstract class AbstractThing
{
public function search(...)
{
$ret = false;

$data = $database->query(...);
foreach($data as $values) {
$ret []= (new $this)->fill_with_values($values);
}

return $ret;
}
}

此返回 bool 值 true。为什么?它适用于不是从抽象类继承的类。

最佳答案

当我们赋值时:

$ret []= (new $this)->fill_with_values($values);

...我们没有设置 $ret[] = (new $this)。相反,此语句将 fill_with_values() 的返回值插入数组,因为它是最后执行的。

看起来您正在尝试实现类似于 factory method pattern 的东西.考虑一下:

abstract class AbstractThing
{
...
public static function fill($values)
{
$instance = new static;
$instance->fill_with_values($values);

return $instance;
}
}

然后我们可以实际上像这样在您的问题中完成您想要完成的事情:

$ret[] = static::fill($values);

这是有效的,因为 fill() 的返回值是类的实例,而不是 fill_with_values() 的返回值。此上下文中的 static 关键字使用 late static binding 来解析执行代码(在本例中为 Thing)的类的类型,而不是声明它的类,因此它通过继承工作。参见 this question获取更多信息。

关于php - 返回带有抽象类的新 $this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com