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