2010-12-12 259 views
1

我正在以模块化的方式编写一个应用程序,所以我可能会重用一些组件。我还编写了不同组件之间共享的实用程序功能。例如,如果我有类A(在A.php中),B(在B.php中)和C(在C.php中)和一个函数f(在utils.php中),并且这个函数同时用于A,B和C,如何组织代码?如何组织PHP代码?

出于测试目的,我分别运行A.php,B.php和C.php,所以我需要在它们中包含utils.php。在所有三个文件中做require_once'utils.php'是一个很好的解决方案吗?我听说使用require_once可能会有一个小小的性能问题。或者我应该写一个单独的'test.php',我会导入所需的所有文件,并使用该代码进行测试,而不是在实际的类文件中编写测试?

+1

相关:http://stackoverflow.com/questions/1812472/in-a-php-project-how-do-you-store-access-and-organize-your-helper-objects – 2010-12-12 13:16:01

+0

你需要包括你的utils到一些引导文件,就像一个数据库设置和东西。 – 2010-12-12 13:16:35

+0

另外请注意,require_once运算符(以及其他_once的东西)是一个丑陋的拐杖,对于那些无法控制其程序流程 – 2010-12-12 13:24:23

回答

1

如果你是编程面向对象,你也可以把函数f放到一个类中; utils.php文件中的utils类。

require_once可能对性能影响最小,因为它必须记住并检查文件是否已包含在内,但它是包含文件的最佳方式,以确保您拥有所需的文件。然后可以包含该文件/类的所有依赖关系。

测试当然不应该在您的班级文件中。我不太得到,如果所有的类都进行测试,现在,或者如果你正在测试您的类...

+0

是的,我正在测试我的课程。我通常有一行if定义('STDIN')并在if块中写入带有assert()的测试代码。 – hayavuk 2010-12-12 13:33:25

0

关于require_once:

是的,它有一些性能问题。当你确定你只包含一次文件时,不要放它,这是一个不必要的检查。

一些建议:

  • 尝试调用需要
  • require_once之间的时间差()与要求()通常不是显著何时使用absolute_path,具有非常大的应用程序的不同之处在于有数百个需要*()的调用,这种情况确实很慢
  • 使用操作码缓存,如APC!
+0

我尝试在适用的情况下使用dirname(__ FILE__)。在引导代码中,我定义了一个$ BASEPATH变量,它包含放置在项目根目录下并始终运行的bootstrap.php的dir名称。 – hayavuk 2010-12-12 13:35:29

+0

确保少做检查并不是一个好主意。 :)你永远不知道会发生什么或者别人用你的代码做什么。 – Kissaki 2010-12-12 13:35:51

3

首先,require_once对于运行测试肯定不是“太慢”。请记住,过早优化是所有邪恶的根源。是的,它有一些开销,但除非它引起错误或减慢生产环境,否则不要麻烦。衡量,衡量衡量。

我倾向于使用的一个好策略与Zend框架类似。

我的名字是基于我的目录结构。例如,一个名为Http_Client_Curl类将在以下目录中lokated:

Http/Client/Curl.php 

有了这样的结构,它很容易和方便使用auto loading。见spl_autoload_register。这意味着您可以根据一个非常简单的约定,让PHP自动包含所有需要它们的文件和类。

+0

+1对于您的过早优化建议! ;) – none 2014-05-23 08:15:28

2

如果你用PHP 5.3来讲话,我相信namespacesauto-loading会很好地适合你的应用。另一方面,传统代码通常使用工厂方法或各种其他类型的核心“includes.inc.php”组织到“库”或“包含”中,以加载类。