Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中何时使用静态修饰符_Php_Oop_Static - Fatal编程技术网

在PHP中何时使用静态修饰符

在PHP中何时使用静态修饰符,php,oop,static,Php,Oop,Static,最近在做一些代码检查时,我遇到了许多类,其中包含大量的静态方法。。。我似乎不明白为什么?因此,我的问题是: 在PHP中使用静态方法的最佳实践是什么 什么时候想用,什么时候不应该用 运行时处理静态方法的具体区别是什么?它们会影响性能或内存占用吗?您不需要创建类的实例来使用其静态方法。静态方法用于 与给定类的整个对象集合相关的函数(例如) 与任何东西都不相关,但由于OO的原因必须放在类下的函数(例如实用程序类) 静态方法不需要实例(可能会返回一个实例),它或多或少类似于一个全局函数,只是它被放在类

最近在做一些代码检查时,我遇到了许多类,其中包含大量的静态方法。。。我似乎不明白为什么?因此,我的问题是:

在PHP中使用静态方法的最佳实践是什么

什么时候想用,什么时候不应该用


运行时处理静态方法的具体区别是什么?它们会影响性能或内存占用吗?

您不需要创建类的实例来使用其静态方法。

静态方法用于

  • 与给定类的整个对象集合相关的函数(例如)
  • 与任何东西都不相关,但由于OO的原因必须放在类下的函数(例如实用程序类)

静态方法不需要实例(可能会返回一个实例),它或多或少类似于一个全局函数,只是它被放在类的命名空间中(从而避免与其他函数冲突),并且可以访问类的私有成员


因此,只要您对函数的这些属性感兴趣,就可以使用它。

关于静态方法的使用,PHP没有什么特别之处

静态方法可以直接在类上调用-无需实例化对象

因此,它们主要用于与类功能相关的方法,但不需要现有实例来用于其他代码

一个常见的例子是一个自定义比较方法,它可以传递给(比如)uasort()函数,对类类型的对象数组进行排序

最近在做一些代码检查时,我遇到了许多类,其中包含大量的静态方法。。。我似乎不明白为什么

PHP在5.3之前没有名称空间,所以所有函数/变量都在全局范围内,除非它们属于某个类。将它们作为静态成员放在类中是一种没有名称空间的解决方法(这可能就是为什么您在“有效”数字中看到它们的原因)


通常,它们用于在单个对象中没有太多用处,但在类级别有一些用处的函数(如其他答案所述)

最佳做法是尽可能避免使用它们,因为它们会破坏可测试性和可维护性。两个伟大的读物详细阐述了:


澄清:在这个问题上似乎有很多误解。缺乏依赖注入才是真正的问题。直接调用静态方法恰好是落入这种陷阱的最常见方法之一。

您可以使用静态方法来获得更好的性能。
您不需要为每个用户创建对象,因为使用您的web应用程序和创建具有多个方法和属性的对象的速度较慢,并且需要更多的系统资源。

到目前为止,还没有人回答最后一个问题——“它们会影响性能或内存占用吗?”Java中通常不鼓励静态的。不确定这对于像PHP这样的解释语言也是正确的。如果您正在进行OOP(正如您标记的那样),那么就永远不会:我以前见过这些参数,但它们并不引人注目。使静态方法可测试的方法是没有副作用;这些方法是所有方法中最可测试的;你给他们一个输入,他们返回一个输出,就是这样。对类参数的硬依赖也没有任何分量;将相关的静态方法分组到一个类中是关键所在。您没有解决这两个链接的关键——依赖关系。能够重写依赖于函数的函数对测试至关重要。公平地说,可以使用静态函数来实现这一点(例如,将函数依赖项作为参数)。然而,PHP中惯用的解决方案是使用可由子类重写的非静态函数。有关详细说明,请参阅。正确编写的静态函数没有任何依赖项,只有直接传递到函数中的依赖项。测试函数,确保它具有预期的行为,然后按原样在所有其他测试中使用它。链接中提供的示例是误用,因为多次调用函数每次都会产生不同的结果。我不知道;我只是不认为这样使用
static
方法有什么好处。问题不在于static的依赖性。它依赖于静态。从“静态方法是致命的”到“可测试性”:对原文似乎有一种常见的误读,Misko说“如果在类中使用静态,那么该类就更难进行单元测试”,人们听到“静态很难进行单元测试”。很难测试的是被静态“感染”的类,而不是静态本身;同意。仔细看这段代码,可以很容易地将
this.hasher
设置为静态哈希函数,这同样可以解决可测试性问题。将相关函数组织为类中的静态函数还可以探索PHP上的一个强大功能:按需自动加载类的能力。If允许您编写代码,而无需担心是否执行了正确的include,也无需包含您可能并不总是使用的内容。您只需调用静态方法,
\uuuu autoload()
就会发挥其神奇作用。干净、优化和功能性编码。甚至名称空间都还没有得到这个。