代码之家  ›  专栏  ›  技术社区  ›  jeroen

被调用子常量在父级的静态函数中不可用

  •  6
  • jeroen  · 技术社区  · 15 年前

    我在一个需要从几个子类调用的类中有一个静态函数。我需要调用子类中的常量在该函数中可用。为了让这些常量在其他地方可用,子类有一个返回该常量值的函数(php 5.2.9)。

    但是,当在父类中时,我似乎无法访问该常量,既不能使用函数也不能直接访问。这在php 5.2.9中是可能的,还是需要将其作为参数传递?

    这是代码的简单版本:

    abstract class ParentClass {
        static function DoSomething() {
            $not_working = self::show_const();
            $not_working_either = self::SOME_CONST;
    
            return 'working';
        }
    }
    
    class ChildClass extends ParentClass {
        const SOME_CONST = 'some string';
    
        function show_const() {
            return self::SOME_CONST;
        }
    }
    
    $result = ChildClass::DoSomething();
    

    编辑: 产生的错误是:

    • 调用未定义的方法parentClass::show const()(用于函数)
    • 未定义的类常量“some-const”(使用self::some-const)
    2 回复  |  直到 13 年前
        1
  •  13
  •   barrowc    15 年前

    不幸的是,你要做的不是5.3之前的工作。这里的问题是 早期的 静态绑定与 晚的 静态绑定。这个 self 关键字提前绑定,因此它只在用于解析符号的类中查找。魔法常数 __CLASS__ 或函数 get_class() 也不起作用,它们也会做早期的静态绑定。因此,php 5.3扩展了 static 关键字表示当用作 static::some_method() .

    因此,在5.3中,这是可行的:

    abstract class ParentClass {
      public static function DoSomething() {
        return static::show_const();
        // also, you could just do
        //return static::SOME_CONST;
      }
    }
    
    class ChildClass extends ParentClass {
      const SOME_CONST = 'some string';
      public static function show_const() {
        return self::SOME_CONST;
      }
    }
    
    $result = ChildClass::DoSomething();
    
        2
  •  2
  •   John Conde    15 年前

    您需要使ChildClass扩展父类::

    class ChildClass extends ParentClass {
    

    编辑:

    您试图从父类中引用子类中的常量和方法,而父类不知道子类的常量存在。这是一个范围问题。子级可以引用父级的方法和常量,但不能引用父级的方法和常量。