Наследование PHP и статические методы и свойства - PullRequest
14 голосов
/ 04 сентября 2011

Можно ли сказать, что статические свойства и методы не могут быть унаследованы в PHP? Несколько примеров будут полезны.

Ответы [ 2 ]

18 голосов
/ 04 сентября 2011

Нет. Это не правда. Статические методы и свойства получат унаследованные так же, как нестатические методы и свойства, и подчинятся тем же правилам видимости:

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

Последние два - заметная разница. Увеличение унаследованного статического свойства в базовом классе также увеличит его во всех дочерних классах и наоборот.

5 голосов
/ 04 сентября 2011

Нет (очевидно, я не мог видеть не в вопросе). Статические методы и свойства 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();
?>

Статические свойства и методы подчиняются правилам видимость и наследование , как показано в этом фрагменте .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...