【问题标题】:Static methods in PHP: what for?PHP 中的静态方法:有什么用?
【发布时间】:2023-03-29 14:45:02
【问题描述】:

我非常抱歉提出这么愚蠢的问题,但我是 OOP 的新手,并试图弄清楚静态方法的用途。这是一个示例 PHP 代码:

class foo{
static function bar(){
//do something here
}
public function baz(){
//do something different
}
}

Documentation 说:

将类属性或方法声明为静态使它们无需实例化即可访问

但是,上面示例中的两种方法都可以从类外部访问,如下所示:

foo::bar();
foo::baz();

它可以在没有类 foo 的实例化的情况下工作(至少对于我正在使用的 PHP 5.3)。 那么,如果这两种方法都有效,那么使用静态方法有什么意义呢?

再次原谅我提出这样一个菜鸟问题。我一直在努力寻找自己,但没有成功。谢谢。

【问题讨论】:

  • 您对baz 的调用在技术上是无效的,即使它会起作用;即使它是实例级方法,您也静态调用它。
  • 在>=5.4(非静态方法的静态调用)中不能这样做。您可以在非静态方法中使用 $this,即使在 5.3(在非对象上下文中使用 $this)也会出错,然后静态调用。
  • 静态方法的意义在于你可以在不实例化类的情况下调用类级别的方法。 baz() 是一个实例方法,应该在类的实例上调用,而 bar() 是一个静态方法,应该在类本身上调用。
  • 好吧,据我了解,只有静态方法应该用 classname::method() 调用,对吧? 只是想知道...如果以这种方式调用非静态方法是无效的,为什么它甚至在
  • 您可能想阅读这篇文章,r.je/static-methods-bad-practice.html

标签: php oop static


【解决方案1】:

静态方法是全局可用的工具(助手)并且经常被过度使用。 Static methods are death to testability 应该几乎完全避免。

它们的优点和缺点是它们存在于全局范围内,您可以从任何地方调用它们,这使得它们在大多数情况下都具有代码味道,因为它们破坏了封装。

正如 Kolink 所提到的,在语言级别上,mysqli:real_escape_string() 之类的东西当然是有意义的,但在应用程序级别上,您通常不想像那样污染全局范围并破坏封装。您宁愿考虑您真正需要哪些工具以及在何处将它们绑定到有意义的组(类)中。

您的foo::baz() 在严格模式下发出警告(应始终开启):

严格标准:非静态方法 foo:baz() 应该 不会在第 x 行的 yourfile.php 中静态调用

【讨论】:

    【解决方案2】:

    通常它们可用于“帮助”函数,例如mysqli::real_escape_string(),其中该函数与类相关但不锁定到它的任何特定实例。

    【讨论】:

    • 明白。但是,如果在我的示例中没有像方法 baz() 那样声明 real_escape_string() 方法会发生什么?为什么仍然可以从类外部访问方法 baz()?
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 2011-07-11
    • 2013-08-30
    • 1970-01-01
    • 2011-04-23
    • 2010-11-13
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多