gpt4 book ai didi

php - 如何判断链中的最后一个方法?

转载 作者:行者123 更新时间:2023-12-04 15:54:19 25 4
gpt4 key购买 nike

我已经开始在我的 PHP 应用程序中使用方法链:

$object->do()->something();

特别是查询数据库:

$database->select()->from('mytable');

但是目前我需要调用一个函数来实际执行最后的查询:

$database->select()->from('mytable')->perform();

这很烦人,因为通常每个链都会立即执行。有时不会,但 10 次中有 9 次会。我需要它来处理任何对象,而不仅仅是数据库处理程序。

有没有办法判断我调用的最后一个方法是否是方法本身的最后一个方法,所以它会在我不告诉它的情况下perform()

如果没有,我可能会尝试使用一些关键字,例如 ->now() 而不是 ->perform()

我有几个想法:

  • 每个方法都有一个参数,如果设置了参数,它就会知道它在最后(也许它可以遍历所有参数以查找是否传递了一个特殊常量?)例如 $object->do()->某事(现在);

最佳答案

在 Perl 的 DBIX::Class 中,它们在使用数据时触发查询。因此每个查询链不返回数据库对象,而是返回一个环绕数据库表对象的 DBIX::Class 对象。

您可以尝试实现类似的系统。因此,例如以下内容:

$resultSet = $database->select()->from('mytable');

实际上返回的不是表格,而是一个结果集对象。并且仅当您尝试这样做时:

$resultSet->next();

库是否真的会从数据库中获取数据。

基本上,所有访问器方法,如 first()last()all()next() 获取并缓存数据。如果数据已经被获取并缓存在内存中,那么进一步调用 resultSet 对象上的访问器方法应该只读取内存中的哈希值而不是连接到数据库。


其他详细信息:

插入没有像 select 这样的复杂子句。所以插入函数不需要是可链接的。因此对于插入,您可以简单地让 API 执行如下操作:

$database->insert()->into('mytable')->values({
foo => "hello",
bar => "world"
});

其中 values() 方法作为插入函数并触发数据库查询。

更新可以简单地在行对象上完成。您可以让 API 执行如下操作:

$row = $database->select()->from('mytable')->first();
$row->foo('goodbye');
$row->update();

或者:

$row->update({
foo => "goodbye"
});

并让 update() 方法触发数据库查询。

关于php - 如何判断链中的最后一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19262297/

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