Использование констант класса и переопределение в PHP - PullRequest
3 голосов
/ 30 марта 2012

Если у меня есть структура класса со значением, которое может быть истинным или ложным, оно не изменяется, в настоящее время реализуемое как переменные, было бы лучше изменить их на константы, такие как:

class Parent {
    const BOOL_CONST = false;

    ...
}

class SomeChild extends Parent {
    const BOOL_CONST = true;

    ...
}

Позже у меня есть объект, который может относиться к любому типу в этой иерархии классов, либо к родительскому, либо к одному из его дочерних элементов, и некоторые из дочерних элементов, например, SomeChild, могут перегрузить значение, чтобы быть истинным.

Есть ли способ получить доступ к константе, не зная класса? Другими словами, я могу сделать что-то вроде:

$object->BOOL_CONST

Или лучше оставить эти значения переменными, даже если они действительно не должны изменяться?

UPDATE

Я перефразировал мой вопрос выше, чтобы лучше выразить то, что я пытался задать.

Ответы [ 5 ]

7 голосов
/ 31 марта 2012

Есть ли способ получить доступ к константе, не зная класса?Другими словами, я могу сделать что-то вроде:

Да, для ссылки на константу вы захотите использовать следующие конструкции:

  • self:: NAME_OF_CONSTANT : дать мне константу, определенную в этом классе;если я не определю это, получи это от моего родителя
  • static :: NAME_OF_CONSTANT : дай мне константу, определенную ТОЛЬКО в этом классе;никогда не ищите у моих родителей
  • parent :: NAME_OF_CONSTANT : дайте мне ТОЛЬКО константу, определенную ТОЛЬКО в моем родительском классе;никогда не обращай на себя внимания

Кстати, ты использовал термин "перегружен";Тем не менее, я полагаю, вы хотели сказать "переопределено"Перегрузка имеет другое семантическое значение в объектно-ориентированных языках.

2 голосов
/ 30 марта 2012

Константа как доступ с двойным двоеточием ::

Parent::BOOL_CONST

SomeChild::BOOL_CONST

within the class
parent::BOOL_CONST  
self::BOOL_CONST
1 голос
/ 24 июня 2014

PHP 5.3 теперь принимает объект как ссылку на класс: $this::BOOL_CONST теперь принято.

//
// http://php.net/manual/en/language.oop5.constants.php
//
// As of PHP 5.3.0, it's possible to
// reference the class using a variable.
// The variable's value can not be a keyword
// (e.g. self, parent and static). 
//

// I renamed "Parent" class name to "constantes"
// because the classname "Parent" can be confused with "parent::" scope
class constantes
{
    const  test                     = false;
}

// I renamed "SomeChild" too, with no reason...
class OverloadConst extends constantes
{
    const test                      = true;
    public function waysToGetTheConstant()
    {
        var_dump(array('$this'=>$this::test));    // true, also usable outside the class
        var_dump(array('self::'=>self::test));    // true, only usable inside the class
        var_dump(array('parent::'=>parent::test));    // false, only usable inside the class
        var_dump(array('static::'=>static::test));    // true, should be in class's static methods, see http://php.net/manual/en/language.oop5.late-static-bindings.php
    }
}

// Classic way: use the class name
var_dump(array('Using classname'    => OverloadConst::test));

// PHP 5.3 way: use the object
$object = new OverloadConst();
var_dump(array('Using object'       => $object::test));
$object->waysToGetTheConstant();

Обратите внимание, что вы можете переопределить константу класса, но не интерфейсную константу. Если constantes является интерфейсом, который реализует OverloadConsts, то вы не можете переопределить его const test (или BOOL_CONST).

Источники

1 голос
/ 30 марта 2012

Вы не можете сделать $object->BOOL_CONST, так как константы класса должны вызываться статически (SomeChild::BOOLCONSTANT).

Однако, может быть, вы можете попробовать что-то вроде этого: // edit: это работает:)

$class = get_class($object);
$const = $class::BOOL_CONST;
1 голос
/ 30 марта 2012

Нет, вы не можете получить доступ к константам из контекста объекта, но вы можете использовать отражение, чтобы получить класс $ object, а затем использовать ::, чтобы получить BOOL_CONST. Итак:

$class = get_class($object);
$class::BOOL_CONST;

Хорошо, нет, это не является технически отражением. Кроме того, я не уверен на 100%, правильно ли разрешится $ class ::. Используйте фактические классы ReflectionClass, если вышеприведенное не работает.

...