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" 用于开发更容易使用、更容易重用的自定义功能,并且更容易测试(另一个大话题)。
现在对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" 用于开发更容易使用、更容易重用的自定义功能,并且更容易测试(另一个大话题)。