Oop 我什么时候应该在类中使用静态方法,其好处是什么?

Oop 我什么时候应该在类中使用静态方法,其好处是什么?,oop,static-methods,static-variables,Oop,Static Methods,Static Variables,我有静态变量的概念,但是类中静态方法的好处是什么。我在一些项目上工作过,但我没有使方法成为静态的。每当我需要调用类的方法时,我都会创建该类的对象并调用所需的方法 Q:方法中的静态变量即使在执行方法时也保持其值,但只能在其包含方法中访问,但静态方法的最佳定义是什么 Q:调用静态方法而不创建该类的对象是静态方法的唯一好处吗 Q:静态方法的可访问范围是什么 感谢静态方法的一个常见用法是命名构造函数习惯用法。请参阅:。您对静态变量的描述更符合C中的描述。在面向对象术语中,静态变量的概念在概念上是不同的。

我有静态变量的概念,但是类中静态方法的好处是什么。我在一些项目上工作过,但我没有使方法成为静态的。每当我需要调用类的方法时,我都会创建该类的对象并调用所需的方法

Q:方法中的静态变量即使在执行方法时也保持其值,但只能在其包含方法中访问,但静态方法的最佳定义是什么

Q:调用静态方法而不创建该类的对象是静态方法的唯一好处吗

Q:静态方法的可访问范围是什么


感谢

静态方法的一个常见用法是命名构造函数习惯用法。请参阅:。

您对静态变量的描述更符合C中的描述。在面向对象术语中,静态变量的概念在概念上是不同的。我在这里借鉴了Java的经验。静态方法和字段在概念上不属于某个实例时非常有用

考虑一个数学类,它包含一些常用值,如Pi或e,以及一些有用的函数,如sin和cos。创建单独的实例来使用这种功能是没有意义的,因此它们作为静态更好:

// This makes little sense
Math m = new Math();
float answer = m.sin(45);

// This would make more sense
float answer = Math.sin(45);

在OO语言中(同样,从Java的角度来看),函数或更好的方法不能有静态局部变量。只有类才能有静态成员,正如我所说,与C中的静态概念相比,这一点几乎没有什么相似之处。

在类中使用静态方法的唯一时间是当给定的方法不需要创建类的实例时。这可能是在尝试返回共享数据源(例如单例)或执行不修改对象内部状态的操作(例如String.format)时发生的


这个维基百科条目很好地解释了静态方法:

静态变量和静态方法绑定到类,而不是类的实例


静态方法不应包含“状态”。与状态相关的任何内容都应该绑定到实例化的对象,而不是类。

本质上,静态方法允许您用面向对象的语言编写过程代码。它允许您调用方法,而无需先创建对象。

:

可以在不创建类对象的情况下调用


只能调用静态方法和函数。

静态方法不会将“this”指针传递给对象,因此它们不能引用非静态变量或方法,但在运行时可能会更有效(创建和销毁对象的参数更少,且无开销)

它们可用于将内聚方法分组到单个类中,或作用于其类的对象,例如在工厂模式中。

静态方法的语法(php):

<?php
class Number {
    public static function multiply($a, $b) {
        return $a * $b;
    }
}
?>
这比:

$number = new Number();
echo $number->multiply(1, 2);

作为
multiply()
方法不使用任何类变量,因此不需要使用
Number

的实例。当您希望在类的不同对象之间共享某些信息时,可以使用静态变量。当共享变量时,每个对象都可以更新它,更新的值也可以用于所有其他对象。
由于可以共享静态变量,这些变量通常被称为类变量。

静态元素可以从任何上下文(即脚本中的任何位置)访问,因此您可以访问这些方法,而无需在对象之间传递类的实例

静态元素在类的每个实例中都可用,因此您可以设置希望对类型的所有成员可用的值


供进一步阅读

这已经被广泛地讨论过了,所以,当你搜索“static method”时,会出现一些问题。我不确定我是否同意“创建单独的实例来使用这种功能是没有意义的,因此它们作为static更好”@Charbel关于数学示例,静态是有意义的,除非你考虑实现.Apple,只是为了添加信息,VB.NET是一个OOP语言,并且允许函数中的静态局部变量。不是提供算术运算的实用程序类。静态方法可以引用另一个类中的非静态方法,只要在静态函数中声明
global$myNonStaticClassObj
。您可以使用此方法读取和设置非静态成员的值,我不明白为什么我总是读到静态方法不能引用非静态成员,这不是真的。@Andresz问题是,从静态方法中,您不能像在实例方法中那样对
$this
运行操作。您可以实例化一个新对象,例如
newstatic,并在其上运行方法,或者像示例中那样声明一个单例。但实际上,您是在一个新对象上,而不是在静态上下文中,在外部运行这些方法。但是您可以从静态方法或函数调用非静态方法或函数,只需在静态函数中将静态函数的类对象声明为
global
。这是正确的,无论如何,静态类可以使用
const
声明常量值,以便为自己提供一个常量、不可更改的值。
$number = new Number();
echo $number->multiply(1, 2);