子类继承父常量,如果是,我如何访问它们?

Cla*_*ire 18 php oop class

问题说的都是真的.

我在父类中定义了常量.我试过了,$this->CONSTANT_1但它不起作用.

class MyParentClass{

    const CONSTANT_1=1
}

class MyChildClass extends MyParentClass{

 //want to access CONSTANT_1  

}
Run Code Online (Sandbox Code Playgroud)

Chr*_*yva 23

我想你需要像这样访问它:

self::CONSTANT_1;
Run Code Online (Sandbox Code Playgroud)

如上所述,或"父母".

有趣

有一点值得注意的是,您实际上可以覆盖子类中的const值.

parent::CONSTANT_1;
Run Code Online (Sandbox Code Playgroud)

  • 对于通过谷歌来到这里的任何人,请查看后期静态绑定的概念。self::CONSTANT 和 static::CONSTANT 产生不同的结果。 (2认同)

Pie*_*ozi 6

您还可以使用静态键从父方法访问子节点中的常量定义.

<?php

class Foo {

    public function bar() {

        var_dump(static::A);
    }
}

class Baz extends Foo {

    const A = 'FooBarBaz';

    public function __construct() {

        $this->bar();
    }
}

new Baz;
Run Code Online (Sandbox Code Playgroud)

  • 为什么“这是要走的路”?你可以解释吗 ?我认为情况恰恰相反,例如,如果您的抽象类有一个方法,并且调用“self”将引用父类的常量值,而“static”非常了解继承并将输出子类值。 (2认同)

Phi*_*ipp 5

您不必使用parent. 您可以使用self它首先检查自身是否存在constant同名class,然后它会尝试访问parents constant.

Soself更通用,并且提供了“覆盖”的可能性parents constant,而无需实际覆盖它,因为您仍然可以通过 显式访问它parent::

以下结构:

<?php

class parentClass {

    const MY_CONST = 12;

}

class childClass extends parentClass {

    public function getConst() {
        return self::MY_CONST;
    }

    public function getParentConst() {
        return parent::MY_CONST;
    }

}

class otherChild extends parentClass {

    const MY_CONST = 200;

    public function getConst() {
        return self::MY_CONST;
    }

    public function getParentConst() {
        return parent::MY_CONST;
    }
}
Run Code Online (Sandbox Code Playgroud)

导致以下结果:

$childClass = new childClass();
$otherChild = new otherChild();


echo childClass::MY_CONST; // 12
echo otherChild::MY_CONST; // 200

echo $childClass->getConst(); // 12
echo $otherChild->getConst(); // 200

echo $childClass->getParentConst(); // 12
echo $otherChild->getParentConst(); // 12
Run Code Online (Sandbox Code Playgroud)

  • 在给出的答案中,在子类中使用“self”是最好的答案。请注意,在 PHP 7.1+ 中,您可以向常量添加可见性修饰符(公共、受保护、私有)。因此,“self”(对类的引用,*本身*)比以往任何时候都更需要理解。但请注意,OP 问题并不涉及访问客户端代码中的常量。 (2认同)