尽管有很多类似的问题,但我还没有找到任何这样具体的答案(或至少是一个强烈固执己见的人)
我(此时)决定使用"helper"类,它只是类中静态方法的聚合,例如恰当地命名为String
。类本身不可能成为对象实例,也没有理由成为对象实例。
String::keysplode('|', 'apple|banana|coconut', array('a', 'b', 'c'));
这里是keysplode()
。它使用给定的分隔符对给定字符串执行explode()
,然后对每个元素调用trim()
。结果数组与array参数一起传递给array_combine()
。结果呢?
array('a' => 'apple', 'b' => 'banana', 'c' => 'coconut');
很棒!幻想!谁在乎呢?
关键是,这个函数真的不属于类。现在它住在'Package'Common'String::keysplode()
,虽然这是一个很好的地方,但我可以看到它是如何被认为是"虐待"的。
我有很多这样的函数,它们属于array_*
或str_*
伪名称空间,以及其他地方。进一步的问题是,我的"真正的"类,那些正确利用OOP的类(或者我相信)密切地使用这些函数。
这个"问题",就像它一样,是这样的函数应该去哪里?
当我们创建扩展语言"核心"功能的函数时,我们把这些函数放在哪里?此外,我们如何管理应用程序的其他部分在函数上创建的依赖关系?
将库函数放入静态类中一直是PHP的习惯用法,因为PHP缺乏名称空间,并且静态方法的语法类似于Perl中访问包函数的语法。
既然PHP有了名称空间,那么明确的答案是将这些方法放入名称空间(而不再是静态类)。虽然我认为这将是一个缓慢的过渡(因为很多人还没有使用PHP 5.3,而且很多人使用的是共享主机),但这种调整是显而易见的,希望框架和库开发人员接受这种新的习惯用法(这是具有c#和Perl等名称空间的其他语言的标准)。
<?php
namespace Foo;
function foo () {
echo 'foo';
}
namespace Bar;
use Foo;
Foo'foo();
在我看来,开发人员正在使用一种精确的语言进行开发,无论是PHP还是其他语言。大多数情况下,用PHP编写的类将在PHP中使用,因此您实际上不需要关心核心函数。使用它们绝对是一种正确的方法,你只需要注意这些函数的变化。
如果你考虑使用其他库的服务,那就完全是另一回事了,但是在这种情况下,你不必担心语言的核心功能。