【问题标题】:Should I avoid using too many static methods in PHP?我应该避免在 PHP 中使用太多的静态方法吗?
【发布时间】:2017-11-05 06:41:51
【问题描述】:

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

【问题讨论】:

  • 是的,您应该避免在 PHP 中使用过多的静态方法,但不是出于内存管理的原因。因为这是一个信号,您没有正确执行 OOP。从长远来看,这将比使用 ram 的几个额外字节(我不确定是否是这种情况)对您造成的伤害更大。
  • 使用静态方法或使用对象的问题是您尝试实现的逻辑的实际范围之一。这应该是你首先关心的:当它变得更复杂时,人们可以理解逻辑,你能够实现特殊情况,而不会因为太多的运行时参数而使代码显得臃肿。像内存占用这样的问题不应该总是被忽略,但现在它们通常不再那么重要了。如果您在此处遇到问题的环境中工作,那您为什么还要使用 OPP?
  • 当然,从OOP的角度来看,我应该避免太多的静态方法。只是想知道在我使用它们之前它们是否会被加载到内存中??
  • 静态方法只是一个具有花哨名称的常规函数​​(如果不是public,则访问受限)。静态方法不是 OOP,它们是变相的过程代码。主脚本的代码在页面被请求时加载到内存中并编译。当(如果)include 语句被执行时,它会加载到内存中并编译include-d 文件。

标签: php static-methods


【解决方案1】:

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

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

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

这取决于你认为有多少是“太多”。对于纯 OOP 代码,一个静态方法已经是“太多了”。但有时为某些功能编写静态方法是不可避免的(阅读“更容易”)。

所以我想知道静态方法是否会在我使用它们之前被加载到内存中。

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

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

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

【讨论】:

  • 苏加。帮了我很多
【解决方案2】:

所以我想知道静态方法是否会在我使用它们之前被加载到内存中。

当一个类被加载时,它的所有方法总是被加载。无论这些方法是类方法还是实例方法,或者它们是否被应用程序使用,都会发生这种情况。

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

【讨论】:

    【解决方案3】:

    我应该使用更多的实例方法而不是太多的静态方法。 有人建议吗?

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

    何时使用静态方法:

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

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

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

    为什么?

    • 常量在类和对象范围内,它始终是不可变的(您不能更改它的值)并且可以安全使用。

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

    您也可以查看Singleton pattern,了解如何使用静态方法进行资源共享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 2010-11-21
      • 2018-06-16
      • 2011-03-26
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2013-09-30
      相关资源
      最近更新 更多