我想要衡量人们对使用静态类而不是命名空间的看法。我来自C ++背景,我非常喜欢它的语法以及它如何让你构建代码。我最近决定将代码分组为逻辑单元而不仅仅是文件。例如,我更喜欢User :: login to user_login之类的调用。所以,我做了一些谷歌搜索,并松了一口气,发现PHP有名称空间。我的解脱并没有持续多久,我真的不喜欢语法;它为我的函数调用增加了更多的混乱。所以,目前我正在使用静态类来模拟命名空间。这有什么缺点吗?
我在PHP Namespaces vs Classes with static functions发现了一个类似的问题,但没有进行太多的讨论。
另外,有没有办法避免以下情况:
class Test {
public static void myFunc() {
Test::myOtherFunc();
}
public static void myOtherFunc() {
}
}
我认为可以在不指定名称的情况下调用同一个类中的函数,但显然不是。是否有任何变通方法(例如在C ++中有using关键字)。
答案 0 :(得分:5)
巧合的是,我实际上正朝着完全相反的方向前进:
使用静态类来模拟命名空间的是你不能在多个文件中组织它们,所有东西都必须在一个文件中定义;这可能取决于个人品味。
关于静态类的另一个问题是,你没有任何状态就开始了,慢慢地一些状态管理就会陷入困境,你最终会遇到一些奇怪的锁定依赖。国家应该保留用于实例。目前我唯一值得注意的静态类是站点范围的配置。
最后,静态类中的自引用是显式的,而在命名空间中,它的工作原理与C ++完全相同:指定函数名称,首先在命名空间中查找它。
答案 1 :(得分:4)
如果从代码结构的角度来看,静态类方法和命名空间函数之间没有区别。它们最终都在全球范围内。唯一不同的是,使用静态类方法,您试图伪造OOP。
因此,如果您真正需要的是独立/实用功能,最好使用命名空间功能。命名空间用于分组事物(函数和类)。
至于你User::login()
的例子,这将是一个不好的做法。相反,你应该有一个真正的对象,它能够包含状态。
$mapper = new UserMapper;
$user = new User;
$user->setNickname( $name );
$mapper->fetch( $user );
if ( $user->hasPassword( $password ) )
{
$user->setLastLogin( time() );
}
else
{
// log the access attempt
// set error state
}
$mapper->save( $user );
底线是:如果您使用静态结构(函数或方法),则不是OOP。你只是假装它。相反,你应该使用真正的OOP dependency injection。
如果您的代码遍布整个地方使用静态方法和变量,则会导致类之间的紧密耦合,添加global state并使harder to maintain and test成为您的代码库。这不是特定于PHP的。