zend 框架自己的功能和 类

zend framework own functions and classes

现在对Zend Framework的使用有了一些体会。我想更深入地研究这个主题并重写一些旧的 php 项目。

保存自己的函数和类的最佳位置是什么? 我如何告诉 Zend 它们在哪里?还是已经有自己的东西的文件夹?我可以为不同的文件设置不同的文件夹吗?

例如,我想保存一个名为 math_b.php 的 php 文档,其中包括几个要计算的特殊函数和另一个 date_b.php 具有日期时间功能的文档。这可能吗?我应该为每个函数准备不同的文件吗?

我也想在其他项目中复用这些功能,然后复制文件夹即可。

对此没有单一的 "right" 答案。不过,有几个我常用的guidelines/principles。

不污染全局作用域

命名您的代码并保留所有功能是 classes。所以,而不是:

function myFunction($x) {
    // do stuff with $x and return a value
}

我会:

namespace MyVendorName\SomeComponent;

class SomeUtils
{
    public static function myFunction($x)
    {
         // do stuff with $x and return a value
    }

}

用法是:

use MyVendorName\SomeComponent\SomeUtils;

$val = SomeUtils::myFunction($x);

为什么要为这一切烦恼呢?如果没有这种命名空间,当您从其他来源将更多代码引入您的项目时 - 当您 share/publish 您的代码供其他人在他们的项目中使用时 - 您最终会遇到他们的 functions/variables 和你的。好篱笆造就好邻居。

使用自动加载器

拥有大量的过去:

require '/path/to/class.php';

在您的消费者代码中早已不复存在。更好的方法是告诉 PHP - 通常在某些 bootstrap 过程中 - 在哪里可以找到 class MyVendor\MyComponent\MyClass。此过程称为自动加载。

如今大多数代码都符合 PSR-0/PSR-4 标准,该标准将名称空间 class 名称映射到相对于文件根目录的文件路径。

在 ZF1 中,通常将 ./library 文件夹添加到 ./public/index.php 中的 PHP include_path,然后将您的供应商命名空间添加到 autoloaderNameSpaces 数组中在 ./application/config.ini:

autoloaderNameSpaces[] = 'MyVendor';

并在文件中放置一个 class 如 MyVendor\MyComponent\MyClass:

./library/MyVendor/MyComponent/MyClass.php

然后您可以简单地引用 MyVendor\MyComponent\MyClass 形式的 class:

// At top of consuming file
use MyVendor\MyComponent\MyClass;

// In the consuming page/script/class.
$instance = new MyClass(); // instantiation
$val = MyClass::myStaticMethod(); // static method call

确定使用范围

如果我有仅特定 class 需要的功能,那么我将该功能作为方法(或方法集合)保留在使用它的 class 中。

如果我有一些功能将在单个项目的多个地方使用,那么我可能会在我自己的库命名空间中将其分解为单个 class,也许 MyVendor

如果我认为 function/class 将被多个项目使用,那么我会使用自己的 repo(例如 Github)将其分解为自己的项目,使其可访问通过 Composer, optimally registering it with Packagist, and pay close attention to semantic versioning 以便我包裹的消费者收到稳定且可预测的产品。

将文件夹从一个项目复制到另一个项目当然是可行的,但是当您修复错误、添加功能和(有时)破坏向后兼容性时,它经常会遇到问题。这就是为什么通常最好将这些 functions/classes 放在一个单独的、语义版本化的项目中,作为该代码的单一真实来源。

结论

将功能分解为单独的、带命名空间的 class 以标准方式自动加载的元素提供了大量 "space" 用于开发更容易使用、更容易重用的自定义功能,并且更容易测试(另一个大话题)。