【发布时间】:2011-11-10 00:47:19
【问题描述】:
可以说静态属性和方法在 PHP 中不能被继承吗?举几个例子会有帮助。
【问题讨论】:
标签: php inheritance static
可以说静态属性和方法在 PHP 中不能被继承吗?举几个例子会有帮助。
【问题讨论】:
标签: php inheritance static
没有。这不是真的。 Static Methods and properties 将获得与非静态方法和属性相同的 inherited 并遵循相同的 visibility rules:
class A {
static private $a = 1;
static protected $b = 2;
static public $c = 3;
public static function getA()
{
return self::$a;
}
}
class B extends A {
public static function getB()
{
return self::$b;
}
}
echo B::getA(); // 1 - called inherited method getA from class A
echo B::getB(); // 2 - accessed inherited property $b from class A
echo A::$c++; // 3 - incremented public property C in class A
echo B::$c++; // 4 - because it was incremented previously in A
echo A::$c; // 5 - because it was incremented previously in B
最后两个是显着的区别。在基类中增加继承的静态属性也会在所有子类中增加它,反之亦然。
【讨论】:
否(显然我在问题中看不到 not)。 public 和 protected 静态方法和属性按照您的预期继承:
<?php
class StackExchange {
public static $URL;
protected static $code;
private static $revenue;
public static function exchange() {}
protected static function stack() {}
private static function overflow() {}
}
class StackOverflow extends StackExchange {
public static function debug() {
//Inherited static methods...
self::exchange(); //Also works
self::stack(); //Works
self::overflow(); //But this won't
//Inherited static properties
echo self::$URL; //Works
echo self::$code; //Works
echo self::$revenue; //Fails
}
}
StackOverflow::debug();
?>
静态属性和方法遵循visibility 和inheritance 规则,如this snippet 所示。
【讨论】: