PHP中的静态方法:为什么?

PHP中的静态方法:为什么?,php,oop,static,Php,Oop,Static,我非常抱歉问了这么一个愚蠢的问题,但我是OOP新手,我试图弄清楚静态方法的用途。下面是一个PHP代码示例: class foo{ static function bar(){ //do something here } public function baz(){ //do something different } } 说: 将类属性或方法声明为静态使它们可以访问,而不需要类的实例化 但是,上述示例中的两个方法都可以通过类似的方式从类外部访问: foo::bar(); foo::baz();

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

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

将类属性或方法声明为静态使它们可以访问,而不需要类的实例化

但是,上述示例中的两个方法都可以通过类似的方式从类外部访问:

foo::bar();
foo::baz();
它在不实例化类foo的情况下工作(至少对于我正在使用的php5.3)。 那么,如果这两种方法都有效,那么使用静态方法有什么意义呢???


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

通常,它们可以用于“助手”函数,例如,函数与类相关但未锁定到类的任何特定实例。

通常,它们可以用于“助手”函数,例如,函数与类相关,但未锁定到类的任何特定实例。

静态方法是全局可用的工具(助手),经常被过度使用。应该几乎完全避免

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

正如Kolink提到的,在语言级别上,像
mysqli:real\u escape\u string()
这样的东西当然有意义,但在应用程序级别上,您通常不想污染全局范围并破坏封装。您更愿意考虑您真正需要什么工具以及在哪里,并将它们捆绑到有意义的组(类)中

您的
foo::baz()
会在严格模式下发出警告(该模式应始终处于启用状态):

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


静态方法是全球可用的工具(助手),经常被过度使用。应该几乎完全避免

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

正如Kolink提到的,在语言级别上,像
mysqli:real\u escape\u string()
这样的东西当然有意义,但在应用程序级别上,您通常不想污染全局范围并破坏封装。您更愿意考虑您真正需要什么工具以及在哪里,并将它们捆绑到有意义的组(类)中

您的
foo::baz()
会在严格模式下发出警告(该模式应始终处于启用状态):

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


您对
baz
的调用在技术上是无效的,即使它可以工作;即使它是实例级方法,也可以静态调用它。在>=5.4(非静态方法的静态调用)中无法执行此操作。您可以在非静态方法中使用$this,即使在5.3中也会出现错误(在非对象上下文中使用$this),然后静态调用。静态方法的要点是,您可以在不实例化类的情况下调用类级方法。baz()是一个实例方法,应该在类的实例上调用,而bar()是一个静态方法,应该在类本身上调用。好的,据我所知,只有静态方法应该用classname::method()调用,对吗?只是想知道。。。如果以这种方式调用非静态方法是无效的,那么为什么它会在中工作呢?您可能想阅读本文,您对
baz
的调用在技术上是无效的,即使它会工作;即使它是实例级方法,也可以静态调用它。在>=5.4(非静态方法的静态调用)中无法执行此操作。您可以在非静态方法中使用$this,即使在5.3中也会出现错误(在非对象上下文中使用$this),然后静态调用。静态方法的要点是,您可以在不实例化类的情况下调用类级方法。baz()是一个实例方法,应该在类的实例上调用,而bar()是一个静态方法,应该在类本身上调用。好的,据我所知,只有静态方法应该用classname::method()调用,对吗?只是想知道。。。如果以这种方式调用非静态方法是无效的,那么为什么它会在中工作呢?您可能想读一下,明白了。但如果real_escape_string()方法没有像我的示例中的方法baz()那样声明为静态,会发生什么呢?为什么方法baz()仍然可以从类外部访问?理解。但如果real_escape_string()方法没有像我的示例中的方法baz()那样声明为静态,会发生什么呢?为什么方法baz()仍然可以从类外部访问?