【问题标题】:PHP Inheritance and Static Methods and PropertiesPHP 继承和静态方法和属性
【发布时间】:2011-11-10 00:47:19
【问题描述】:

可以说静态属性和方法在 PHP 中不能被继承吗?举几个例子会有帮助。

【问题讨论】:

    标签: php inheritance static


    【解决方案1】:

    没有。这不是真的。 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
    

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

    【讨论】:

      【解决方案2】:

      否(显然我在问题中看不到 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 所示。

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 2016-10-10
        • 1970-01-01
        • 2011-05-15
        • 2013-03-28
        • 1970-01-01
        • 2016-10-06
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多