2012-03-30 6 views
3

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

class Parent { 
    const BOOL_CONST = false; 

    ... 
} 

class SomeChild extends Parent { 
    const BOOL_CONST = true; 

    ... 
} 

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

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

$object->BOOL_CONST 

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

UPDATE

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

+0

возможно дубликат [Могу ли я получить Const, определенный на классе PHP?] (HTTP: //stackoverflow.com/questions/956401/can-i-get-consts-defined-on-a-php-class) –

+0

@JuicyScripter Не вижу сходства самостоятельно? Думаю, мой вопрос был больше связан с необходимостью получения значения на уровне объекта, которое не должно меняться, но не зная имя класса. В настоящее время они реализуются как переменные, но некоторые из меня чувствовали, что они должны быть постоянными. Но похоже, что так оно и ломается. – AntonChanning

ответ

1

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).

Источники

2

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

Parent::BOOL_CONST 

SomeChild::BOOL_CONST 

within the class 
parent::BOOL_CONST 
self::BOOL_CONST 
+0

+1 Спасибо. Наверное, я действительно должен оставить эти значения в качестве переменных, хотя они не должны меняться. Мне они нужны извне класса. – AntonChanning

+0

Как вы видите выше, это: 'ClassName :: CONST' –

+0

Да, но это работает только в том случае, если я знаю имя класса. Если объект может быть одним из множества классов, я не могу этого сделать. – AntonChanning

1

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

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

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

+0

+1 Хотя я подозреваю, что использование ReflectionClass может быть излишним для моих целей. Вероятно, мне лучше сохранить значения как переменные, а не убирать их в константы только потому, что они не должны меняться. – AntonChanning

+0

Согласен; обычно лучше поддерживать скорость над чистотой (я часто это делаю), а ReflectionClass - один медленный бегемот. – Matthematics

1

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

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

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

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

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

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

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

+1

Спасибо. Вы правы в том, что меня ограничивают термины «перегрузка» и «переопределение». Я отредактирую вопрос, чтобы использовать правильный термин. – AntonChanning

 Смежные вопросы

  • Нет связанных вопросов^_^