6

我在一个需要从多个子类调用的类中有一个静态函数。我需要调用子类中的一个常量才能在该函数中使用。为了让这些常量在其他地方可用,子类有一个返回该常量值的函数(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)
4

2 回答 2

13

不幸的是,您尝试做的不会在 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();
于 2010-01-23T16:26:25.513 回答
2

您需要使 ChildClass 扩展父类::

class ChildClass extends ParentClass {

编辑:

您试图从不知道子类常量存在的父类中引用子类中的常量和方法。这是一个范围问题。子进程可以引用父进程的方法和常量,反之则不行。

于 2010-01-23T15:59:21.727 回答