Php 静态方法与否?

Php 静态方法与否?,php,class,Php,Class,我需要使用PHP开发一个小型CMS,现在我正试图弄清楚它的结构 CMS将使用一组函数生成。比如数据库功能、缓存、国际化等等 我想这样做: 使函数非静态方法成为大型“site”类的一部分;这样我就可以运行该类的多个实例。但我不确定我是否需要这样做 或者使用静态方法将函数拆分为单独的类 这里的主要问题是CMS应该能够管理多个小型站点,而不仅仅是一个。所以我要么让所有方法都是静态的,并添加一个“site switch”函数,要么让它们成为普通的对象,我根据我想要管理的站点实例化它们 以下哪一项是最

我需要使用PHP开发一个小型CMS,现在我正试图弄清楚它的结构

CMS将使用一组函数生成。比如数据库功能、缓存、国际化等等

我想这样做:

  • 使函数非静态方法成为大型“site”类的一部分;这样我就可以运行该类的多个实例。但我不确定我是否需要这样做

  • 或者使用静态方法将函数拆分为单独的类

这里的主要问题是CMS应该能够管理多个小型站点,而不仅仅是一个。所以我要么让所有方法都是静态的,并添加一个“site switch”函数,要么让它们成为普通的对象,我根据我想要管理的站点实例化它们


以下哪一项是最好的选择?

我绝对建议使用静态类来完成这项工作。这样做将为所有函数创建一个伪名称空间,这样您就不必担心函数名冲突等问题,而且还可以避免为了调用一个助手函数而必须传递助手类的实例。

我绝对建议使用静态类来完成此任务。这样做将为所有函数创建一个伪名称空间,这样您就不必担心函数名冲突等问题,而且还可以避免为了调用一个助手函数而必须传递助手类的实例。

静态方法通常是不好的做法。它们引入了许多潜在的问题

1) 它们引入了隐藏的依赖关系。任意调用foo::bar()的代码依赖于foo,在没有定义foo的情况下无法运行。使用foo::bar()的对象将正确构造,但如果未定义foo,则该对象将不可用

2) 静态是全局的。全局状态非常糟糕,任何东西都可以更改代码,其状态未知。通过使用静态方法,您牺牲了OOP封装所实现的功能和控制

3) 不可能用不同的版本替换这些函数

4) 这使得单元测试变得不可能


有关更多详细信息和代码示例,请参阅和

静态方法通常是不好的做法。它们引入了许多潜在的问题

1) 它们引入了隐藏的依赖关系。任意调用foo::bar()的代码依赖于foo,在没有定义foo的情况下无法运行。使用foo::bar()的对象将正确构造,但如果未定义foo,则该对象将不可用

2) 静态是全局的。全局状态非常糟糕,任何东西都可以更改代码,其状态未知。通过使用静态方法,您牺牲了OOP封装所实现的功能和控制

3) 不可能用不同的版本替换这些函数

4) 这使得单元测试变得不可能


有关更多详细信息和代码示例,请参见和

切勿创建单片“一体式”类。由于各种原因,这是一种不好的做法。了解更多关于类的实现。这是一个全新的项目吗?如果是这样的话,为什么不使用某种MVC框架呢?大多数MVC框架都能很好地工作,正如您在前面的问题中所提到的。“哪一个是最好的选择?”如果没有对软件工程的全面讨论,很难回答。然而,我要说的是:通常,静态是邪恶的。这是我的。我强烈建议避免使用静态语言,而使用依赖注入。如果您想升级自己,请自己完成。如果不是,尝试一个框架。永远不要制作一个单一的“一体化”类。由于各种原因,这是一种不好的做法。了解更多关于类的实现。这是一个全新的项目吗?如果是这样的话,为什么不使用某种MVC框架呢?大多数MVC框架都能很好地工作,正如您在前面的问题中所提到的。“哪一个是最好的选择?”如果没有对软件工程的全面讨论,很难回答。然而,我要说的是:通常,静态是邪恶的。这是我的。我强烈建议避免使用静态语言,而使用依赖注入。如果您想升级自己,请自己完成。如果不是,请尝试一个框架。既然
foo::bar()
是一个全局状态,并且它几乎与
foo\u bar()
…那么它不可能避免全局状态?以内置过程函数为例-
array\u push()
array\u rand()
等。因此,如果我在方法中的某个地方使用
array\u push()
,那么它也会引入全局状态?这些是技术上静态的叶方法,由Misko Hevery在第二个链接中解决:“静叶法是一个等待发展并成为问题的滑坡。静态方法是程序化的。。。就Math.abs(-5)而言。。。我真的很想写-5.abs()”。内置函数的问题比较少,因为它们不能随时间变化,而且它们不会遇到隐藏依赖项的问题(它们总是可用的)虽然它们在测试过程中都不可能被替换,但您必须测试静态方法以及您尝试测试的方法。因为
foo::bar()
是一个全局状态,它几乎与
foo\u bar()
…那么它不可能避免全局状态?以内置过程函数为例-
array\u push()
array\u rand()
等。因此,如果我在方法中的某个地方使用
array\u push()
,那么它也会引入全局状态?这些都是技术上的静态叶方法,Misko Hevery在第二个链接中提到:“静态叶方法是一个等待增长并成为问题的滑坡。静态方法是程序化的。。。就Math.abs(-5)而言。。。我真的很想写-5.abs()”。内置函数的问题比较少,因为它们不能随时间而改变,也不会遇到hid问题