程序功能与静态方法。哪个更好或避免两者?

时间:2013-01-06 15:37:35

标签: php oop static dependency-injection

我只是查看Codeigniter的一些核心文件,我发现它使用了一些你可能称之为遍布整个地方的过程函数,比如在核心类中的某个地方获取配置类的实例,而不是将其注入它刚刚做的对象

$config =& get_config();

我不是专家但不是那么糟糕吗?对我而言,似乎使应用程序具有不必要的全局状态。

据我所知,它几乎与做

之类的事情完全相同
$config = App::loadClass('config');

这样做的第二种方式比第一种更差吗?我想这可能是因为在调用它时第二种方式App类需要存在(并且被定位)并且第一种方式是第一种方式,不存在特定的类,并且不需要包含类文件如此少的要求。

我正在创建自己的框架并且避免使用任何静态的东西到目前为止但是当我查看主要框架的代码以获取想法或帮助时,我会看到所有地方的静态内容并且我想知道为什么?

你会认为领先的框架会被编码得更好一些,或者使用全局方法并不像许多人认为的那样有害,你会怎么想?

在我的框架中,我必须将此$config对象注入到许多类和$logger对象以及$messages/$language和其他一些对象中。我使用依赖注入容器和工厂,但与仅仅执行

相比,它仍然有点痛苦
$config = App::loadClass('config');
$someSetting = $config->setting('some.setting');
Logger::write('debug', 'some message');

如果我要使用静态方法,我应该使用过程式(Codeigniter示例)还是类中嵌入的那些?或者你强烈建议永远不要使用它们吗?

任何意见都会非常感谢。

2 个答案:

答案 0 :(得分:2)

  

我不是专家但不是那么糟糕吗?对我而言,似乎使应用程序具有不必要的全局状态。

正确。这应该避免。它不仅引入了全局状态,而且还吐出strict警告:

  

严格标准:只应通过引用分配变量......

  

这样做的第二种方式比第一种还差吗?

不要认为情况更糟,因为至少你没有得到Strict Standards警告。但你真的想避免这种情况。

  

我正在创建自己的框架并且避免使用任何静态的东西到目前为止但是当我查看主要框架的代码以获取想法或帮助时,我会看到所有地方的静态内容并且我想知道为什么?

这是因为大多数流行的框架都很糟糕。它们不仅会引入错误的编码实践,而且通常它们也会告诉您它使用的是MVC结构(大部分都不是这样)。

  

你会认为领先的框架会被编码得更好一些,或者使用全局方法并不像许多人认为的那样有害,你会怎么想?

这些框架再次充满了WTF。如果你真的认为你想要研究一个流行的框架,你应该看看Symfony 2或Zend FW 2.不是因为他们以正确的方式做所有事情,而是因为他们是最好的(流行的)imho。

  

在我的框架中,我必须将这个$ config对象注入到许多类和$ logger对象以及$ messages / $语言等等。

依赖注入是解决此问题的正确方法(至少如果您要采用OOP方法)。但是,如果你的类有很多依赖关系,你可能不得不停下来思考一下你的类可能做得太多的事实。 A.k.a他们有too many responsibilities

  

如果我要使用静态方法,我应该使用过程式(Codeigniter示例)还是类中嵌入的那些?或者你强烈建议永远不要使用它们吗?

强烈建议反对两者。正如您在介绍全球状态时所述。让测试变得痛苦。并且与OOP有关的程序编程更多。

P.S。在我看来,我已经给你了两个最好的FW。如果你想知道CodeIgniter和Cake是最糟糕的。

要完成此帖子,请the PHP chatroom Lusitanian之间的相关信息:

  

Microframework (n):少量垃圾。另请参阅 Framework (n):大量垃圾。

答案 1 :(得分:1)

在我看来,CodeIgniter是一个低质量的PHP框架,例如Zend Framework或Symfony。另外我认为静态函数在OOP中有其特定的作用,例如可以在实现注册表模式,日志等时使用。关于程序功能,我强烈建议不要在OOP应用程序中使用它们。