繁体   English   中英

PHP继承和静态方法和属性

[英]PHP Inheritance and Static Methods and Properties

是否可以安全地说静态属性和方法不能在PHP中继承? 一些例子会有所帮助。

不,那不是真的。 静态方法和属性将与非静态方法和属性一样继承 ,并遵循相同的可见性规则:

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

最后两个是显着的差异。 增加基类中的继承静态属性也会在所有子类中递增它,反之亦然。

不(显然我看不到问题中没有 )。 publicprotected静态方法和属性将按照您的预期继承:

<?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();
?>

静态属性和方法遵循此代码段中所示的可见性继承规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM