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

pgccezyw  于 2023-03-11  发布在  PHP
关注(0)|答案(8)|浏览(142)

最近做了一些代码检查,我发现很多类中有大量的静态方法......而我似乎无法理解为什么?因此我提出了以下问题:
在PHP中使用静态方法的最佳实践是什么?
什么时候人们想使用它们,什么时候人们不应该使用它们?
运行时处理静态方法的具体区别是什么?它们会影响性能或内存占用吗?

huwehgph

huwehgph1#

最近做了一些代码检查,我遇到了一些类,其中有大量的静态方法......我似乎不能理解为什么
PHP在5.3之前没有名称空间,所以所有的函数/变量都在全局作用域中,除非它们属于某个类。将它们作为静态成员放入类中是没有名称空间的一种变通方法(这可能就是为什么你看到它们的数量“显著”)
通常,它们用于在单个对象中没有多大用处的函数,但在类级别上有一些用处(如其他答案所述)

yv5phkfx

yv5phkfx2#

最好的做法是尽可能避免使用它们,因为它们会扼杀可测试性和可维护性。

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

mwg9r5ms

mwg9r5ms3#

静态方法用于

  • 与给定类的整个对象集合相关的函数(例如singleton pattern
  • 与任何事物都不相关,但由于面向对象而必须放在类下的函数(例如实用程序类)
w8rqjzmb

w8rqjzmb4#

静态方法不需要示例(也可以返回一个),并且或多或少类似于全局函数,除了它被放在类的命名空间中(因此避免了与其他函数的冲突),并且可以访问类的私有成员。
所以,当你对函数的这些性质感兴趣时,就可以使用它。

0qx6xfy6

0qx6xfy65#

对于静态方法的使用,PHP没有什么特别的规定。
静态方法可以直接在类上调用-不需要示例化对象。
因此它们主要用于与类功能相关的方法,但不需要现有示例来用于其他代码。
一个常见的例子是一个定制的比较方法,它可以传递给uasort()函数来排序类类型的对象数组。

1qczuiv0

1qczuiv06#

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

eqoofvh9

eqoofvh97#

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

r55awzrz

r55awzrz8#

当一个方法不需要类的示例,并且可能需要与类的任何示例分开使用时,它应该是静态的,只要它可以被安全地依赖。类的示例可以作为参数传递给静态方法,但是我认为这是一个不好的做法,因为它会给调试代码带来困难。
误用静态方法,肯定会造成很难测试的代码。如果静态方法需要在单元测试中用非静态方法测试,那么它不应该是静态的。但是,如果你可以独立于任何类示例完全测试所有可能的边缘情况,那么就不需要担心单元测试,因为静态方法可以有自己独立的单元测试。
另一件你应该考虑的事情是依赖注入。静态方法可以通过将它们放在一个单独的命名空间中来覆盖。要覆盖静态方法,你可以简单地将命名空间与你覆盖的静态方法交换。然而,如果你需要这样做,那么你很可能误用了静态。
如果一个方法目前是静态的,但在将来的修改之后可能就没有意义了,那么最好将它设置为非静态的。它需要被依赖,而没有引起bug的风险。误用静态肯定会导致依赖噩梦。
很多人认为避免静态方法是最好的做法,但是我不同意,因为每种编程语言都有大量的内置函数和静态关键字。我们不会仅仅因为它们是静态的就重写它们。我们只是不担心它,因为我们知道我们可以依赖它们,如果我们愿意,我们可以非常容易地测试它们的任何可能的边缘情况。

相关问题