3

如果我有一个值可以是真或假的类结构,那么它不会改变,目前实现为变量,最好将它们更改为常量,例如:

class Parent {
    const BOOL_CONST = false;

    ...
}

class SomeChild extends Parent {
    const BOOL_CONST = true;

    ...
}

后来我有一个对象,它可能是该类层次结构中的任何类型,无论是父级还是它的一个子级,并且某些子级可能(例如“SomeChild”)已将值重载为真。

有什么方法可以在不知道类的情况下访问常量吗?换句话说,我可以做类似的事情:

$object->BOOL_CONST

还是将这些值保留为变量会更好,即使它们确实不应该改变?

更新

我已经改写了我上面的问题,以更好地表达我试图问的问题。

4

5 回答 5

7

有什么方法可以在不知道类的情况下访问常量吗?换句话说,我可以做类似的事情:

是的,为了引用一个常量,您需要使用以下结构:

  • self::NAME_OF_CONSTANT:给我一个在这个类中定义的常量;如果我不定义它,请从我的父母那里获得
  • static::NAME_OF_CONSTANT:只给我一个在这个类中定义的常量;永远不要向我父母寻求它
  • parent::NAME_OF_CONSTANT:只给我一个在我的父类中定义的常量;永远不要自己寻找它

顺便说一句,您使用了“重载”一词;但是,我相信您的意思是说“被覆盖”。重载在面向对象语言中具有不同的语义含义。

于 2012-03-30T20:39:29.653 回答
2

使用双冒号访问常量::

Parent::BOOL_CONST

SomeChild::BOOL_CONST

within the class
parent::BOOL_CONST  
self::BOOL_CONST
于 2012-03-30T15:12:33.460 回答
1

PHP 5.3 now accepts the object as the class reference: $this::BOOL_CONST is now accepted.

//
// 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();

Note that you can override a class constant, but not an interface constant. If constantes is an interface that OverloadConsts implements, then you can not override its const test (or BOOL_CONST).

Sources

于 2014-06-24T13:00:37.417 回答
1

不,您不能从对象上下文访问常量,但您可以使用反射来获取 $object 的类,然后使用 :: 来获取 BOOL_CONST。所以:

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

好吧,不,这不是技术上的反思。另外,我不能 100% 确定 $class:: 是否会正确解析。如果上述方法不起作用,请使用实际的 ReflectionClass 类。

于 2012-03-30T15:13:38.063 回答
1

你不能这样做$object->BOOL_CONST,因为类常量必须被静态调用(SomeChild::BOOLCONSTANT)。

但是,也许您可​​以尝试类似的方法:// 编辑:这行得通 :)

$class = get_class($object);
$const = $class::BOOL_CONST;
于 2012-03-30T15:14:27.150 回答