为什么静态函数中const未定义?

3

为什么静态函数f2()中无法识别name常量?

class Foo {
    protected static function f1($s) {
        echo "doing $s";
    }
}
class Bar extends Foo {
    const name = 'leo';
    public static function f2() {
        Foo::f1(name);
    }
}
$bar = new Bar();
$bar->f2();

I get the following error:

Notice: Use of undefined constant name - assumed 'name' in ...

我做错了什么?

1个回答

15

非常简单,name常量未定义。您定义的是一个类常量。 您可以通过以下方式访问它:

Bar::name

或者在Bar类或其任何子类中

self::name

只有在5.3及以上版本中,可以从Bar类或其任何子类内部执行:

static::name

那么,将调用更改为:

public static function f2() {
    Foo::f1(self::name);
}

这样就可以了...

哦,还有一点要注意的是,通常情况下,常量的命名规范是全部大写。所以应该是const NAME = 'leo';,并使用self::NAME来引用。你不一定非要按照这种方式做,但我认为这有助于提高可读性...


正是我所需要的。许多类似问题的答案对我来说很难理解何时使用静态 vs. self 来定义类常量。这使得问题非常清晰易懂。 - Rohn Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接