6

我在雄辩的 ORM 库中遇到过这一行:

return with(new static)->newQuery();

我以前从未见过使用过“with”,在 PHP 文档中也找不到它。我猜“with”是大多数搜索中的停用词,所以我什至没有接近。

在多年的 PHP 编程中从未遇到过“with”,我觉得我错过了。它有什么作用?我确实遇到过一条关于 ORM 的评论,在 PHP-5.4 中不再需要提到“with”,但这与所说的一样多。如果那是准确的,最好知道 PHP-5.4 的等价物是什么。

更新:支持答案的详细信息:-

我在 Laravel 的 Immuminate/Support/helpers.php 辅助脚本中找到了这个辅助函数:

if ( ! function_exists('with'))
{
    /**
     * Return the given object. Useful for chaining.
     *
     * @param  mixed  $object
     * @return mixed
     */
    function with($object)
    {
        return $object;
    }
}

正如一些答案中提到的。该全局范围函数允许在一个语句中创建对象并在 t 中运行方法。它(不知何故)在安装 Laravel 时在 composer autoload_files.php 脚本中注册,因此它会在每个页面上加载,即使它不包含任何类。

谢谢大家。不要假设所有东西都必须是现代框架中的命名空间类。

4

3 回答 3

8

这是一个看起来像这样的函数:

function with($obj) { 
    return $obj; 
}

它是更短的版本和更易读的版本new ExampleObj()->newQuery()with函数不是在 PHP 中构建的。它是 PHP 5.4 之前版本的解决方法。正如@Rocket Hazmat 在 PHP 5.4+ 中指出的那样,您可以在这里执行new ExampleObj()->newQuery()这样with的功能,让您保持可读的向后兼容性。

于 2013-11-11T15:57:46.893 回答
3

with函数是 Laravel 提供的帮助器,如此所述。最好的文档是代码,如您所见,它只是返回对象。在 5.4 / 5.4 中,最好将表达式括在括号中,以避免不必要的函数调用的开销。

于 2013-11-11T15:59:57.973 回答
3

我认为@Izkata在评论中一针见血。

[我猜]这是一种解决方法,类似于new Foo()->newQuery()在某些版本的 PHP 中不起作用

在 PHP 5.4 中添加了以下内容:

添加了对实例化的类成员访问,例如(new Foo)->bar().

(来源:http ://www.php.net/manual/en/migration54.new-features.php )

所以,我假设with看起来像这样:

function with($x){
    return $x;
}

在 PHP 5.4+ 中,你可以这样做(new static)->newQuery(),但在旧版本中,你不能。 with可能在那里,所以你可以这样做with(new static)->newQuery(),这将适用于任何 PHP 版本。

于 2013-11-11T16:00:46.827 回答