PHP静态类或命名空间
我想了解人们对使用静态类而不是名称空间的看法。我来自C++背景,我很喜欢它的语法,以及它如何让你构造代码。我最近决定,我需要将代码分组到逻辑单元中,而不仅仅是文件。例如,我更喜欢像User::login这样的调用,而不是User\u login。所以,我在谷歌上搜索了一下,发现PHP有名称空间,我松了一口气。我的解脱没有持续多久,我真的不喜欢语法;它给我的函数调用增加了更多的混乱。所以,目前我正在使用静态类来模拟名称空间。这有什么坏处吗 我在会议上发现了一个类似的问题,但没有太多的讨论 此外,是否有办法避免以下情况:PHP静态类或命名空间,php,namespaces,static-class,Php,Namespaces,Static Class,我想了解人们对使用静态类而不是名称空间的看法。我来自C++背景,我很喜欢它的语法,以及它如何让你构造代码。我最近决定,我需要将代码分组到逻辑单元中,而不仅仅是文件。例如,我更喜欢像User::login这样的调用,而不是User\u login。所以,我在谷歌上搜索了一下,发现PHP有名称空间,我松了一口气。我的解脱没有持续多久,我真的不喜欢语法;它给我的函数调用增加了更多的混乱。所以,目前我正在使用静态类来模拟名称空间。这有什么坏处吗 我在会议上发现了一个类似的问题,但没有太多的讨论 此外,是
class Test {
public static void myFunc() {
Test::myOtherFunc();
}
public static void myOtherFunc() {
}
}
我假设在同一个类中调用函数而不指定名称是可以的,但显然不是。是否有任何解决办法(例如在C++中使用关键字)。p> 巧合的是,我实际上正朝着完全相反的方向移动:
最后,静态类中的自引用是显式的,而命名空间中的引用与C++的完全一样:你指定函数名,它首先在命名空间内查找。
如果从代码结构的角度看,静态类方法和命名空间函数之间没有区别。它们最终都是全球性的。唯一的区别是,使用静态类方法,您试图伪造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。你只是假装而已。相反,您应该使用真正的面向对象编程,使用
如果您的代码到处使用静态方法和变量,则会导致类之间的紧密耦合,添加并生成代码库。这不是PHP特有的。
self::
和$this->
在PHP中分别用于调用您自己的静态方法和实例方法。因此,没有办法将限定隐式化?ie检查当前类的函数?不,但我发现显式是一件好事:)嘿,我喜欢在类之间显式,但我习惯于在类内隐式。哦,好吧,我想我最终会习惯的。你应该试着超越审美上的分歧。这将比仅仅因为喜欢双冒号而模仿名称空间更有益。我喜欢名称空间的想法以及它们如何让您管理代码,正如您所说,您可以跨多个文件组织它们。我唯一真正抱怨的是笨拙的语法。我不认为有必要使用\并删除与其他语言的一致性。@user1520427我知道您的感受,它不是一个很好的外观,但可以将其视为目录结构,这很有意义:)默认的自动加载程序实际上也是这样使用的。