我应该避免在 PHP 中使用太多静态方法吗?

Should I avoid using too many static methods in PHP?

众所周知,静态方法可以在不实例化class的情况下被调用。所以我想知道静态方法是否会在我使用它们之前加载到内存中。如果那样的话,在我看来,我应该使用更多的实例方法而不是太多的静态方法。有人建议吗?我不熟悉 PHP.

的底层机制

So I wonder if static methods will be loaded into memory before I use them.

加载 class 时,始终会加载其所有方法。无论这些方法是 class 方法还是实例方法,或者它们是否被应用程序使用,都会发生这种情况。

使用最适合您的设计的任何类型的方法。

静态方法只是一个具有奇特名称的常规函数​​(如果不是 public,则访问受限)。

静态方法不是 OOP,它们是变相的过程代码。

Should I avoid using too many static methods in PHP?

这取决于你认为有多少"too many"。对于纯 OOP 代码,一个静态方法已经是 "too many"。但有时不可避免(阅读"easier")为某些功能编写静态方法。

So I wonder if static methods will be loaded into memory before I use them.

无论您是 运行 使用 CLI 的 PHP 脚本还是通过 Web 服务器调用它来提供网页,脚本的文本都会加载到内存中并进行编译。如果编译成功(即没有语法错误),解释器开始执行它。

此时脚本中定义的所有内容都已在内存中,但只有主脚本中定义的项目。编译阶段不处理包含语句 (include, include_once, require, require_once)。

include 语句引用的文件被加载到内存中,编译和执行时 并且如果 include 语句在 include 语句期间到达脚本的执行。包含文件的全部内容被加载、解析并转换为操作码,无论它是否包含函数、类 或全局代码。从这个角度看,实例方法和静态方法没有区别。

I should use more intance methods instead of too many static methods. Anyone advice?

有时候你需要定义一个静态方法,如果你需要在不创建该方法的对象的情况下调用它class,但这应该是有限的。

何时使用静态方法:

  • 您可以使用静态方法作为工厂,根据上下文创建对象或与其他实例共享资源。

  • 如果与您的目的和实例无关

如果您打算使用 public 静态属性,我建议在某些情况下使用 CONST,除非您不想更改其值。

为什么?

  • 常量位于 class 和对象范围内,并且它始终不可变(您无法更改其值)并且可以安全使用。

  • 静态属性不在对象范围内,而是在 class 范围内及其可变(可以更改)并且使用起来不安全。

或者您可以查看 Singleton pattern 以了解如何在资源共享上使用静态方法。