2012-01-09 99 views
0

可能重复:
When to use static vs instantiated classes什么时候在PHP中使用静态类?

我有一个小麻烦了解的静态优势/劣势VS在PHP“正常”类,因为它似乎我能够两者都做同样的事情。

如果我能够有静态变量的类和获取/静态方法很容易地修改他们,为什么我更需要的类实例?

+0

*(尖端)* http://kore-nordmann.de/blog/0103_static_considered_harmful方法。 HTML – Gordon 2012-01-09 22:05:06

+1

有没有这样的事情作为一个“静态类”,只有具有'static'性能和/或方法的类。 – deceze 2012-01-09 22:34:36

+0

它变得非常混乱,但我想这将帮助:http://www.php5-tutorial.com/classes/static-classes/ – Omar 2015-02-18 21:15:25

回答

3

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

当多于一个类的实例会有实例时,实例很有用。

+0

哦,爽。所以,如果我有一个自动加载的类,并且它拥有唯一的价值是一个类数组(与合并值以数组的方法),这将是一个良好的使用静态值/方法?这将不需要有多个实例。 – Rob 2012-01-09 22:08:03

1

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

+2

-1只是一个链接,我会再-1它使用的网址缩短启动。 – ceejayoz 2012-01-09 21:55:52

+1

大声笑 - 是的,可能是我们所知道的一个rickroll。简短的答案与链接是好的,但只是链接是可疑的。 – 2012-01-09 22:01:01

7

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

抽象类为您提供了一种机制,可以使用通用API构建一个对象,该对象可以专用于各种其他对象,而这些对象是其子类的对象,但对于泛型类的实例存在。例如,如果你是构建动物管理的系统,那么你可能有特定的动物,如猫鼬,鼬,壁虎,蛇,鱼等类。系统中的一些动物可以按照共同特征组合在一起。例如,所有提到的动物都是脊椎动物,所以你可能有一个脊椎动物类,它描述了所有可归类为脊椎动物的动物共有的特征。

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

基本上,你应该想到一个抽象类是定义一个类,可以从它派生的对象的一般行为的一种方式。

很抱歉,如果我没有解释自己很好,这是一个更简单的概念来理解比它解释。另一方面,如果你谈论的只是静态方法的类,那么这只是程序员欺骗自己相信他编写的过程代码是“面向对象编程”的一种方式。这不是,它只是一种伪装程序编程的方式。

有思想的学校,对静态方法皱眉,因为它们可以使代码的测试部分隔离非常困难。虽然他们确实有其用途,但通常建议避免使用静态方法。

4

一个静态类并不需要与运营商被实例化。它始终可用,而“正常”类必须实例化。

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

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" 

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

相关问题