如果我的类结构的值可以是true或false,那么不会改变,当前实现为变量会更好地将它们更改为常量,例如:
class Parent {
const BOOL_CONST = false;
...
}
class SomeChild extends Parent {
const BOOL_CONST = true;
...
}
稍后我有一个对象,该对象可以是该类层次结构中的任何类型,可以是父级或其子级,也可以是某些子级,例如“SomeChild”已将值重载为true。
有没有办法在不知道课程的情况下访问常量?换句话说,我可以这样做:
$object->BOOL_CONST
或者将这些值保留为变量会更好,即使它们确实不应该更改?
更新
我已经在上面重述了我的问题,以便更好地表达我试图提出的问题。
答案 0 :(得分:7)
有没有办法在不知道课程的情况下访问常量? 换句话说,我可以这样做:
是的,为了引用常量,您需要使用以下结构:
答案 1 :(得分:2)
使用双冒号::
作为访问的常量Parent::BOOL_CONST
SomeChild::BOOL_CONST
within the class
parent::BOOL_CONST
self::BOOL_CONST
答案 2 :(得分:1)
不,你不能从对象上下文访问常量,但你可以使用反射来获取$ object的类,然后使用::来获取BOOL_CONST。所以:
$class = get_class($object);
$class::BOOL_CONST;
好吧,不,那不是技术上的反思。另外,我不是100%确定$ class ::会正确解析。如果上述方法不起作用,请使用实际的ReflectionClass类。
答案 3 :(得分:1)
你不能$object->BOOL_CONST
,因为必须静态调用类常量(SomeChild::BOOLCONSTANT
)。
但是,也许你可以尝试这样的事情://编辑:这有效:)
$class = get_class($object);
$const = $class::BOOL_CONST;
答案 4 :(得分: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
)。
<强>来源强>