关于oop:何时在PHP中使用静态类?

When to use static classes in PHP?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to use static vs instantiated classes

我在理解PHP中静态类和"普通"类的优缺点时遇到了一些困难,因为看起来我可以对这两个类做相同的事情。

如果我能够在类中拥有静态变量,并使用静态方法轻松地获取/修改它们,为什么我甚至需要类实例?


你确定你不是指抽象类吗?PHP有抽象类和静态方法。

抽象类为您提供了一种使用通用API构建对象的机制,该API可以专门用于作为其子类的各种其他对象,但对于该类的一个实例的存在来说,它是没有意义的。例如,如果您正在构建一个管理动物的系统,那么您可以为特定的动物(如猫鼬、雪貂、壁虎、蛇、鱼等)创建类。系统中的一些动物可以按共同特征分组在一起。例如,上面提到的所有动物都是脊椎动物,所以您可能有一个脊椎动物类,它描述了所有可以归类为脊椎动物的动物的共同特征。

然而,没有脊椎动物这样的动物,所以你不应该有脊椎动物类的实例。你可以有雪貂和蛇的例子,这些例子应该具有脊椎动物的所有特征,但是脊椎动物的例子是没有意义的。当然,你也可以再分为两类,一类是哺乳动物,另一类是爬行动物,介于脊椎动物和特定动物之间,但它们也是抽象的,不能有实例。

基本上,您应该将抽象类视为定义可能从中派生的对象类的一般行为的一种方法。

对不起,如果我没有很好地解释自己,理解这个概念比解释要简单得多。

另一方面,如果你所说的类只包含静态方法,那么这只是一种让程序员自欺欺人地相信他所写的过程代码是"面向对象编程"的方法。它不是,它只是一种掩饰过程编程的方法。

有些思想流派不赞成静态方法,因为它们会使代码的独立测试非常困难。虽然它们确实有它们的用途,但通常建议避免使用静态方法。


静态类不需要使用新的运算符实例化。它总是可用的,而"普通"类必须被实例化。

实例类可以有多个实例,静态类只能有一个"实例"。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class StaticHello {
  static protected $sProperty = 'static';
  static public function sayHello()
  {
    echo 'Hello, I am ' . self::$sProperty;
  }
}

class InstancedHello {
  protected $sProperty;
  public function __construct($name)
  {
    $this->sProperty = $name;
  }
  public function sayHello()
  {
    echo 'Hello, I am ' . $this->sProperty;
  }
}

StaticHello::sayHello();
// outputs"Hello, I am static"

$oInstance1 = new InstancedHello('Rob');
$oInstance2 = new InstancedHello('Fbableus');
$oInstance1->sayHello();
// outputs"Hello, I am Rob"
$oInstance2->sayHello();
// outputs"Hello, I am Fbableus"

请注意,实例类可能具有所有实例共享的静态属性和方法,并且可由::运算符访问。


类的Static实例只发生一次,其变量可用于类的任何实例。实例有自己的单独值,其他实例无法访问这些值,除非它们被标记为Static

当类有多个实例时,实例很有用。


下面是一个很好的解释:KarlBunyan在php5静态类上的博客