zend框架拥有自己的函数和类

时间:2015-10-13 14:06:13

标签: zend-framework

现在我有使用Zend Framework的一些经验。我想深入讨论这个主题并重写一些旧的php项目。

保存自己的功能和类的最佳位置是什么? 我怎么告诉Zend他们在哪里?或者已经有自己的东西的文件夹?我可以为不同的文件使用不同的文件夹吗?

例如,我想保存一个名为math_b.php的php文档,其中包含几个要计算的特殊函数和另一个具有日期时间内容的date_b.php。这是可能的还是每个功能都有不同的文件?

我还想在其他项目中重用这些功能,然后只复制文件夹。

1 个答案:

答案 0 :(得分:1)

没有单一的"权利"回答这个问题。但是,我通常会采用一些通用的指导方针/原则。

不污染全球范围

命名空间代码并保持所有函数都是类。所以,而不是:

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);

为什么要烦恼这一切?如果没有这种命名空间,当您从其他来源将更多代码带入项目时 - 当您共享/发布代码以供其他人在项目中使用时 - 您最终会遇到其功能/变量与您之间的名称冲突。良好的围栏是好邻居。

使用自动装带器

过去有很多:

require '/path/to/class.php';
消费者代码中的

早已不复存在。更好的方法是告诉PHP - 通常在某些引导过程中 - 在哪里找到类MyVendor\MyComponent\MyClass。此过程称为自动加载。

这些天的大多数代码都符合PSR-0/PSR-4标准,它将名称间隔的类名映射到相对于文件根的文件路径。

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

autoloaderNameSpaces[] = 'MyVendor';

并将类似MyVendor\MyComponent\MyClass的类放在文件中:

./library/MyVendor/MyComponent/MyClass.php

然后,您可以使用以下内容引用MyVendor\MyComponent\MyClass形式的类:

// 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

确定使用范围

如果我只为特定的类需要功能,那么我将该函数保存为使用它的类中的方法(或方法集合)。

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

如果我认为一个函数/类将由多个项目使用,那么我将其分解为自己的项目(例如,在Github上),通过Composer使其可访问,最佳将其注册到Packagist,并密切关注semantic versioning,以便我的包裹的消费者能够获得稳定且可预测的产品。

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

结论

将功能分解为以标准方式自动加载的单独的命名空间类,可以提供足够的空间"在其中开发更容易消费,更容易重复使用以及更容易测试的自定义功能(另一个时间的大型主题)。