以最干净/最快的方式避免多次调用和检索数据库中的数据?

时间:2020-06-16 作者:Charlie C

所以这可能是一个很难回答的问题,但我相信如果我能找到答案,我就能清理代码并显著加快速度。

我经常使用Woocommerce构建项目,在这样做的过程中,我发现自己编写的函数经常使用来自其他函数的相同调用。例如:

$last_order = wc_get_customer_last_order();

$customer = new WC_Customer( $customer_id );
例如。这些在各种功能中经常使用。在我的整个功能中,一次性调用并重用它们的最佳实践是什么(速度和清洁度方面)。php文件-同时仍然允许我从.php 文件和未接收错误?TIA。

1 个回复
SO网友:mozboz

这是一个很好的问题。有一条简单但不那么干净的路要走,还有一条更干净但更复杂的路要走。

简单、肮脏的方式,您可以在PHP中声明全局变量,这些变量将在本页面加载中的PHP中的任何位置可用。例如,第一次打电话时,你可以说:

global $store_last_order;
$store_last_order = wc_get_customer_last_order();
然后,任何时候需要最后一个订单而不是再次调用该函数时,只需使用以下命令:

global $store_last_order; // get access to this again
do_something($store_last_order);
Good things: 这是快速而简单的。

Bad things: 你必须确保你知道变量首先在哪里使用,所以你首先在那个地方设置它,然后其他地方使用它,或者在任何人使用它之前设置一次。

更好的是,您还可以使用PHP数组来传递所需的所有信息。E、 g.在函数顶部做一次。php或其他需要它的地方:

$important_stuff = [ \'last_order\' => get_last_order(),
                     \'customer_info\' => get_customer_info() ]
                      ....
                   ];
然后,无论何时需要这些东西,请确保您以某种方式可以访问$important\\u内容(在函数调用中传递它,或者如果必须的话,将其设置为全局),然后执行以下操作:

do_something($important_stuff[\'last_order\']) ; // e.g. to get last_order
**很好**这更简洁、快速、更易于编写

**坏**如果规模过大,可能会失控。你必须到处传递对$important\\u东西的引用

最好的、更复杂的是,您可以编写自己的PHP类,该类负责存储所有这些信息,如果还没有信息,则负责获取这些信息。

E、 g.:

$myStore = get_my_data_store();
$last_order = $myStore->get_last_order();
那么在这个类中,它可能会做一些类似的事情:

function get_last_order() {
     if (already got the last order before) {
           return last order;
     } else {
           get last order
           return last order;
     }
}
Good: 这是一个更干净的代码,如果您以后扩展它,它的可扩展性会更好,从而节省您的资金和时间。您将成为一名更好的开发人员,并且将来能够更快地完成更多的工作

Bad: 这需要编写更多的代码,您必须学习PHP单例和在PHP中使用类之类的知识

相关推荐

是否使用插件覆盖主题中的WooCommerce loop-start.php?

“我的主题”有一个覆盖内容/主题/主题名/woocommerce/循环/loop-start.php.我想使用插件覆盖此文件。我知道可以使用子主题来完成,但我想使用插件(因为我在1个插件中捆绑了许多其他修改)。我在堆栈交换上发现了其他一些类似的问题,但无法找到有效的解决方案。以下是我的尝试:使用theme_file_path:add_filter( \'theme_file_path\', \'override_woocommerce_loop_template\', 9999); fu