最近做了一些代码检查,我发现很多类中有大量的静态方法......而我似乎无法理解为什么?因此我提出了以下问题:在PHP中使用静态方法的最佳实践是什么?什么时候人们想使用它们,什么时候人们不应该使用它们?运行时处理静态方法的具体区别是什么?它们会影响性能或内存占用吗?
huwehgph1#
最近做了一些代码检查,我遇到了一些类,其中有大量的静态方法......我似乎不能理解为什么PHP在5.3之前没有名称空间,所以所有的函数/变量都在全局作用域中,除非它们属于某个类。将它们作为静态成员放入类中是没有名称空间的一种变通方法(这可能就是为什么你看到它们的数量“显著”)通常,它们用于在单个对象中没有多大用处的函数,但在类级别上有一些用处(如其他答案所述)
yv5phkfx2#
最好的做法是尽可能避免使用它们,因为它们会扼杀可测试性和可维护性。
澄清:在这个问题上似乎有很多误解。缺乏依赖注入才是真实的的问题。直接调用静态方法恰好是落入那个陷阱的最常见方式之一。
mwg9r5ms3#
静态方法用于
w8rqjzmb4#
静态方法不需要示例(也可以返回一个),并且或多或少类似于全局函数,除了它被放在类的命名空间中(因此避免了与其他函数的冲突),并且可以访问类的私有成员。所以,当你对函数的这些性质感兴趣时,就可以使用它。
0qx6xfy65#
对于静态方法的使用,PHP没有什么特别的规定。静态方法可以直接在类上调用-不需要示例化对象。因此它们主要用于与类功能相关的方法,但不需要现有示例来用于其他代码。一个常见的例子是一个定制的比较方法,它可以传递给uasort()函数来排序类类型的对象数组。
1qczuiv06#
您可以使用静态方法以获得更好的性能。您不需要为每个使用您的Web App的用户创建对象,创建具有多个方法和属性的对象速度较慢,并且需要更多的系统资源。
eqoofvh97#
您不需要创建类的示例来使用其静态方法。
r55awzrz8#
当一个方法不需要类的示例,并且可能需要与类的任何示例分开使用时,它应该是静态的,只要它可以被安全地依赖。类的示例可以作为参数传递给静态方法,但是我认为这是一个不好的做法,因为它会给调试代码带来困难。误用静态方法,肯定会造成很难测试的代码。如果静态方法需要在单元测试中用非静态方法测试,那么它不应该是静态的。但是,如果你可以独立于任何类示例完全测试所有可能的边缘情况,那么就不需要担心单元测试,因为静态方法可以有自己独立的单元测试。另一件你应该考虑的事情是依赖注入。静态方法可以通过将它们放在一个单独的命名空间中来覆盖。要覆盖静态方法,你可以简单地将命名空间与你覆盖的静态方法交换。然而,如果你需要这样做,那么你很可能误用了静态。如果一个方法目前是静态的,但在将来的修改之后可能就没有意义了,那么最好将它设置为非静态的。它需要被依赖,而没有引起bug的风险。误用静态肯定会导致依赖噩梦。很多人认为避免静态方法是最好的做法,但是我不同意,因为每种编程语言都有大量的内置函数和静态关键字。我们不会仅仅因为它们是静态的就重写它们。我们只是不担心它,因为我们知道我们可以依赖它们,如果我们愿意,我们可以非常容易地测试它们的任何可能的边缘情况。
8条答案
按热度按时间huwehgph1#
最近做了一些代码检查,我遇到了一些类,其中有大量的静态方法......我似乎不能理解为什么
PHP在5.3之前没有名称空间,所以所有的函数/变量都在全局作用域中,除非它们属于某个类。将它们作为静态成员放入类中是没有名称空间的一种变通方法(这可能就是为什么你看到它们的数量“显著”)
通常,它们用于在单个对象中没有多大用处的函数,但在类级别上有一些用处(如其他答案所述)
yv5phkfx2#
最好的做法是尽可能避免使用它们,因为它们会扼杀可测试性和可维护性。
澄清:在这个问题上似乎有很多误解。缺乏依赖注入才是真实的的问题。直接调用静态方法恰好是落入那个陷阱的最常见方式之一。
mwg9r5ms3#
静态方法用于
w8rqjzmb4#
静态方法不需要示例(也可以返回一个),并且或多或少类似于全局函数,除了它被放在类的命名空间中(因此避免了与其他函数的冲突),并且可以访问类的私有成员。
所以,当你对函数的这些性质感兴趣时,就可以使用它。
0qx6xfy65#
对于静态方法的使用,PHP没有什么特别的规定。
静态方法可以直接在类上调用-不需要示例化对象。
因此它们主要用于与类功能相关的方法,但不需要现有示例来用于其他代码。
一个常见的例子是一个定制的比较方法,它可以传递给uasort()函数来排序类类型的对象数组。
1qczuiv06#
您可以使用静态方法以获得更好的性能。您不需要为每个使用您的Web App的用户创建对象,创建具有多个方法和属性的对象速度较慢,并且需要更多的系统资源。
eqoofvh97#
您不需要创建类的示例来使用其静态方法。
r55awzrz8#
当一个方法不需要类的示例,并且可能需要与类的任何示例分开使用时,它应该是静态的,只要它可以被安全地依赖。类的示例可以作为参数传递给静态方法,但是我认为这是一个不好的做法,因为它会给调试代码带来困难。
误用静态方法,肯定会造成很难测试的代码。如果静态方法需要在单元测试中用非静态方法测试,那么它不应该是静态的。但是,如果你可以独立于任何类示例完全测试所有可能的边缘情况,那么就不需要担心单元测试,因为静态方法可以有自己独立的单元测试。
另一件你应该考虑的事情是依赖注入。静态方法可以通过将它们放在一个单独的命名空间中来覆盖。要覆盖静态方法,你可以简单地将命名空间与你覆盖的静态方法交换。然而,如果你需要这样做,那么你很可能误用了静态。
如果一个方法目前是静态的,但在将来的修改之后可能就没有意义了,那么最好将它设置为非静态的。它需要被依赖,而没有引起bug的风险。误用静态肯定会导致依赖噩梦。
很多人认为避免静态方法是最好的做法,但是我不同意,因为每种编程语言都有大量的内置函数和静态关键字。我们不会仅仅因为它们是静态的就重写它们。我们只是不担心它,因为我们知道我们可以依赖它们,如果我们愿意,我们可以非常容易地测试它们的任何可能的边缘情况。