Наследуют ли дочерние классы родительские константы, и если да, то как мне получить к ним доступ?

Вопросы говорят, что все это действительно.

У меня есть константы, определенные в моем родительском классе. Я пробовал $this->CONSTANT_1, но он не работает.

class MyParentClass{

    const CONSTANT_1=1
}

class MyChildClass extends MyParentClass{

 //want to access CONSTANT_1  

}

Ответ 1

Я думаю, вам нужно получить к нему доступ следующим образом:

self::CONSTANT_1;

или в качестве альтернативы "parent", который всегда будет значением, установленным в родительском классе (т.е. поддерживается постоянная неизменность):

parent::CONSTANT_1;

Интересный

Интересно отметить, что вы можете переопределить значение const в своем дочернем классе.

class MyParentClass{

    const CONSTANT_1=1;
}

class MyChildClass extends MyParentClass{

    const CONSTANT_1=2;
}

echo MyParentClass::CONSTANT_1; // outputs 1
echo MyChildClass::CONSTANT_1; // outputs 2

Ответ 2

Вы также можете получить доступ к константе define у ​​детей из родительского метода со статическим ключом.

<?php

class Foo {

    public function bar() {

        var_dump(static::A);
    }
}

class Baz extends Foo {

    const A = 'FooBarBaz';

    public function __construct() {

        $this->bar();
    }
}

new Baz;

Ответ 3

Вам не нужно использовать parent. Вы можете использовать self, который сначала проверил бы, есть ли constant с тем же именем в самой class, тогда он попытается получить доступ к parents constant.

So self более универсален и предоставляет возможность "перезаписать" 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;
    }
}

Приводятся следующие результаты:

$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

Ответ 4

<?php
class MyParentClass{
    const CONSTANT_1=123;
}

class MyChildClass extends MyParentClass{

    public static function x() {
        echo parent::CONSTANT_1;
    }

}

MyChildClass::x();

Пример в реальном времени: http://codepad.org/Yqgyc6MH

Ответ 5

Используйте parent, например:

class MyParentClass{

    const CONSTANT_1=1;
}

class MyChildClass extends MyParentClass{

   function __construct(){
      echo parent::CONSTANT_1;  //here you get access to CONSTANT_1 
   }

}

new MyChildClass();

ИЛИ

 class MyParentClass{

        const CONSTANT_1=1;
    }

    class MyChildClass extends MyParentClass{

      MyParentClass::CONSTANT_1; // here you you get access to CONSTANT_1 too

    }

Ответ 6

Вы хотите использовать ключевое слово self.

class Whale
{
    const BLOWHOLES = 1;
}

class BlueWhale extends Whale
{ 
    /**
     * A method that does absolutely nothing useful.
     */
    public function funnyCalculation()
    {
        return self::BLOWHOLES + 2;  // This is the access you are looking for.
    }
}

В руководстве по PHP вы найдете способы доступа к константам класса внутри и вне определения класса.