可能重复:
何时使用静态vs实例化类
我在理解PHP中静态vs"普通"类的优点/缺点时遇到了一些麻烦,因为我似乎能够对两者做同样的事情.
如果我能够在类中使用静态变量并使用静态方法轻松获取/修改它们,为什么我甚至需要类实例?
你确定你不是指抽象课吗?PHP有抽象类和静态方法.
抽象类为您提供了一种使用通用API构建对象的机制,该API可以专门用于作为其子类的各种其他对象,但是对于存在的通用类的实例而言没有意义.例如,如果您正在构建一个管理动物的系统,那么您可能会有特定动物的课程,如猫鼬,雪貂,壁虎,蛇,鱼等.系统中的一些动物可以通过共同特征组合在一起.例如,提到的所有动物都是脊椎动物,因此您可能有一个脊椎动物类别,它描述了可归类为脊椎动物的所有动物的共同特征.
然而,没有脊椎动物这样的动物,所以你不应该有一个脊椎动物类的实例.你可以有雪貂和蛇的实例,这些实例应该具有脊椎动物的所有特征,但脊椎动物的实例是没有意义的.当然,你可以进一步细分,你可能有一个哺乳动物和爬行动物类,它们位于脊椎动物和特定动物之间,但它们也是抽象的,不能有实例.
基本上,您应该将抽象类视为定义可能从其派生的一类对象的一般行为的一种方式.
对不起,如果我没有很好地解释自己,这是一个比理解更简单的概念.
另一方面,如果你谈论的是只包含静态方法的类,那么这只是程序员自欺欺人地相信他所编写的程序代码是"面向对象编程"的一种方式.它不是,它只是一种伪装程序编程的方式.
有些学派对静态方法不屑一顾,因为它们可以非常难以单独测试代码段.虽然它们确实有用,但通常建议避免使用静态方法.
小智 5
一个静态类并不需要与被实例化新的运营商.它总是可用的,而"普通"类必须是实例.
instanced类可能有很多实例,静态实例只有一个"实例".
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"
Run Code Online (Sandbox Code Playgroud)
请注意,实例化类可能具有所有实例共享的静态属性和方法,并且可由::运算符访问