【问题标题】:When to use static classes in PHP? [duplicate]什么时候在 PHP 中使用静态类? [复制]
【发布时间】:2012-02-06 09:57:08
【问题描述】:

可能重复:
When to use static vs instantiated classes

我在理解 PHP 中静态类与“普通”类的优缺点方面有点困难,因为我似乎可以对两者做同样的事情。

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

【问题讨论】:

标签: php oop static


【解决方案1】:

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

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

但是,没有脊椎动物这样的动物,因此您不应该拥有 Vertebrate 类的实例。你可以有雪貂和蛇的实例,这些实例应该具有脊椎动物的所有特征,但脊椎动物实例没有意义。当然,您可以进一步子类化,您可能有一个哺乳动物和一个爬行动物类,它们位于脊椎动物和特定动物之间,但它们也是抽象的,不能有实例。

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

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

另一方面,如果您谈论的类只包含静态方法,那么这只是程序员自欺欺人地相信他正在编写的过程代码是“面向对象编程”的一种方式。不是,它只是一种伪装程序编程的方式。

有些学派不赞成静态方法,因为它们会使孤立地测试代码段变得非常困难。虽然它们确实有其用途,但通常建议避免使用静态方法。

【讨论】:

  • 据我所知,任何具有至少一个静态方法或属性的类都称为静态类。
【解决方案2】:

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

当类的实例不止一个时,实例很有用。

【讨论】:

  • 哦,酷。因此,如果我有一个自动加载器类,并且它拥有的唯一值是一个类数组(具有将值合并到该数组的方法),那将是对静态值/方法的良好使用吗?没有必要为此设置多个实例。
【解决方案3】:

static 类不需要使用 new 运算符进行实例化。它始终可用,而“普通”类必须被实例化。

实例化类可能有很多实例,静态类只有一个“实例”。

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"

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

【讨论】:

    【解决方案4】:

    这里有一个很好的解释:Karl Bunyan's blog on PHP5 Static classes

    【讨论】:

    • -1 只是一个链接,我会再次 -1 以使用 URL 缩短器启动。
    • 大声笑 - 是的,据我们所知,这可能是一个 rickroll。带有链接的简短答案是可以的,但只是链接是可疑的。
    猜你喜欢
    • 2015-07-29
    • 2014-03-15
    • 2010-11-18
    • 1970-01-01
    • 2012-03-10
    • 2011-01-06
    • 2012-09-15
    • 2011-06-16
    • 2010-09-11
    相关资源
    最近更新 更多