我正在以模块化方式编写应用程序,因此我可以重用一些组件。我还编写了在不同组件之间共享的实用程序函数。例如,如果我有类A(在A.php中),B(在B.php中)和C(在C.php中)和一个函数f(在utils.php中),并且这个函数用于两者A,B和C,如何组织代码?
出于测试目的,我分别运行A.php,B.php和C.php,所以我需要在所有这些中包含utils.php。在所有三个文件中执行require_once'utils.php'是一个很好的解决方案吗?我听说使用require_once可能会遇到轻微的性能问题。或者我应该写一个单独的'test.php',我会导入我需要的所有文件,并使用该代码进行测试而不是在实际的类文件中编写测试?
答案 0 :(得分:3)
首先,require_once
对于运行测试肯定不会“太慢”。请记住,过早优化是万恶之源。是的,它有一些开销,但除非它导致错误或减慢您的生产环境,不要打扰。衡量,衡量措施。
我倾向于使用的一个好策略类似于Zend Framework。
我的类名基于我的目录结构。例如,名为Http_Client_Curl的类将被挂载在以下目录中:
Http/Client/Curl.php
使用这样的结构,使用auto loading非常简单方便。见spl_autoload_register。这意味着您可以根据非常简单的约定,让PHP自动包含所有需要它们的文件和类。
答案 1 :(得分:2)
如果您使用PHP 5.3发言,我相信namespaces和auto-loading可以很好地适应您的应用程序。另一方面,遗留代码往往被组织成"库"或"包括"核心" includes.inc.php"使用工厂方法或其他各种design pattern来加载类。
答案 2 :(得分:1)
如果你是面向对象的编程,你也可以把函数f放到一个类中; utils.php文件中的utils类。
require_once对性能的影响可能很小,因为它必须记住并检查文件是否已被包含,但这是包含文件的最佳方式,以确保您拥有所需的文件。然后,您可以包含该文件/类的所有依赖项。
测试当然不应该在您的类文件中。如果你现在所有的课程都要进行测试,或者你正在测试你的课程,我不太明白......
答案 3 :(得分:0)
关于require_once:
是的,它有一些性能问题。如果您确定只包含该文件一次,请不要将其放入,这是一项不必要的检查。
一些建议: