繁体   English   中英

在PHP中使用类常量和重写

[英]Using class constants and overriding in PHP

如果我的类结构的值可以是true或false,那么不会改变,当前实现为变量会更好地将它们更改为常量,例如:

class Parent {
    const BOOL_CONST = false;

    ...
}

class SomeChild extends Parent {
    const BOOL_CONST = true;

    ...
}

后来我有一个对象,可以是该类层次结构中的任何类型,父项或其子项之一,并且某些子项可能像“SomeChild”一样将值重载为true。

有没有办法在不知道课程的情况下访问常量? 换句话说,我可以这样做:

$object->BOOL_CONST

或者将这些值保留为变量会更好,即使它们真的不应该改变?

UPDATE

我已经对上面的问题进行了重写,以便更好地表达我试图提出的问题。

有没有办法在不知道课程的情况下访问常量? 换句话说,我可以这样做:

是的,为了引用常量,您将需要使用以下构造:

  • self :: NAME_OF_CONSTANT :给我一个在这个类中定义的常量; 如果我没有定义它,请从我父母那里得到它
  • static :: NAME_OF_CONSTANT :只给我一个在这个类中定义的常量; 永远不要看我的父母
  • parent :: NAME_OF_CONSTANT :仅在我的父类中给我一个常量; 永远不要为自己看

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

使用双冒号作为访问的常量::

Parent::BOOL_CONST

SomeChild::BOOL_CONST

within the class
parent::BOOL_CONST  
self::BOOL_CONST

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

请注意,您可以覆盖类常量,但不能覆盖接口常量。 如果constantesOverloadConsts实现的接口,那么您不能覆盖其const test (或BOOL_CONST )。

来源

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

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

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

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

但是,也许你可以试试这样的东西://编辑:这个有用:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM