好的设计要求每个函数只写一次。在 PHP 中,我通过使用包含文件(如 Utils.php 和 Authenticate.php)和 PHP 命令 include_once 来执行此操作。但是,我无法找到 PHP 包含文件的任何标准或最佳实践。你在 StackOverflow 有什么建议?
我在找:
- 命名标准
- 代码标准
- 设计模式
- 定义常用函数的返回类型的建议(现在我只是使用关联数组)。
好的设计要求每个函数只写一次。在 PHP 中,我通过使用包含文件(如 Utils.php 和 Authenticate.php)和 PHP 命令 include_once 来执行此操作。但是,我无法找到 PHP 包含文件的任何标准或最佳实践。你在 StackOverflow 有什么建议?
我在找:
我喜欢使用的一种约定是将每个类放在自己的名为 ClassName.class.php 的文件中,然后设置自动加载器以包含类文件。或者有时我会将它们全部放在一个类/子目录中,然后将它们命名为 ClassName.php。取决于我期望有多少类与非类包括。
如果您将实用程序函数组织到类中并改为将它们设为静态方法,那么您可以在顶级文件中只编写一个require_once()来摆脱困境。这种方法可能适合也可能不适合您的代码或编码风格。
至于返回类型,我尝试遵循内置函数中使用的约定。返回适合请求的类型,或在失败时返回 false。只需确保在结果中检查 false 时使用=== 运算符。
您关心约定的事实表明您已经走在正确的轨道上。如果您熟悉任何其他 OOP 语言,如 Java、C++、C# 等,那么您会发现由于PHP5 中的 OOP 优点,您可以遵循许多相同的约定。
无论您最终使用哪种命名约定(我更喜欢尽可能从 Java 或 C# 中获取线索),请确保您是否将包含文件用于函数,它们实际上不会在包含时执行任何代码,并且永远不要包含两次相同的文件。(使用include-once或require-once)
已经编写了一些这样的标准。大多数大型项目将遵循自己的标准。
这是 Zend 编写的,是 Zend 框架中使用的标准。 http://framework.zend.com/manual/en/coding-standard.html
此外,PEAR 总是有一些相当严格的编码标准: http: //pear.php.net/manual/en/standards.php
不过我更喜欢的答案是,对于你自己的项目,你应该使用你觉得舒服的东西,并且在内部保持一致。对于其他项目,请遵循他们的规则。一致性允许最大的代码可读性。我自己的标准和 PEAR 的标准不一样。我不使用四个空格缩进(我使用制表符),并且我从不使用函数名称之类的驼峰式大小写,但尽管如此,如果我正在编辑另一个项目中的某些内容,我将使用该项目所做的任何事情。
我做了以下事情。首先,我创建了一个拦截过滤器,以拦截所有 Web 请求,我还创建了一个可以使用命令行命令的版本。
两个拦截器都将进入一个引导文件,该文件将设置一个自动加载器。这个文件作为自动加载函数和一个哈希。对于散列,键是类名,值是类文件的文件路径。自动加载功能将简单地获取类名并对文件运行要求。
如果您需要一些性能提示,请在定义文件时使用单引号,因为它们不会被解释,因此速度会稍快一些,还可以使用 require/include,而不是它们的 _once 版本,这样可以保证运行一次,并且前者要快一些。
上面的内容很棒,事实上,即使有一个包含大量类的大型代码库,散列也没有那么大,性能从来都不是问题。更重要的是,我们并没有与一些疯狂的伪名称空间类命名约定结婚,见下文。
另一个选项是分隔名称,伪名称空间技巧。这不那么有吸引力,因为名称空间将随 5.3 一起提供,我认为这很恶心,因为在代码库中重命名这些名称空间会不那么有趣。无论如何,这就是它的工作原理,假设您的所有代码都有根。然后所有类都根据到达那里所需的目录遍历来命名,用字符分隔,例如'_',然后是类名本身,但是文件将以类命名。这样类的位置在名称中进行编码,自动加载器可以使用它。除了 real_long_crazy_class_names_MyClass 之外,此方法的问题在于每次调用都有相当多的处理,但这可能是过早的优化,并且名称空间再次出现。
例如。
/code root
ClassA ClassA.php
/subfolder
subFolder_ClassB ClassB.php