php - 通过父实例化的类访问常量

时间:2014-09-08 13:27:16

标签: php oop

首先是一些代码...

包含常量的FlashBagUtil类:

class FlashBagUtil
{
    const TYPE_NOTICE  = 'notice';
    const TYPE_WARNING = 'warning';
    const TYPE_ALERT   = 'alert';
    const LANG_EN      = 'en';
    const LANG_RU      = 'ru';
    const LANG_IL      = 'il';
}

家长班:

class CoreController
{
    public $flashUtil;

    public function __construct()
    {
        $this->flashUtil = new FlashBagUtil;
    }
}

儿童班:

class BatchController extends CoreController
{
    public function indexAction()
    {
        // Method 1 - This works fine
        $flash     = $this->flashUtil;
        $flashType = $flash::TYPE_NOTICE;

        // Method 2 - This, obviously, does not
        $flashType = $this->flashUtil::TYPE_NOTICE;

        // Method 3 - Neither does this as $flashUtil is a non-static instantiated object
        $flashType = self::$flashUtil::TYPE_NOTICE;
    }
}

PHP文档states:声明为static的属性无法使用实例化的类对象访问(尽管静态方法可以)。

但我似乎能够用第一种方法做到这一点。我错过了什么?

+

方法1是在此上下文中访问静态内容的唯一且最干净的方法吗?

3 个答案:

答案 0 :(得分:3)

您引用的类constant与类变量(属性)不同,并且可以被实例化的对象访问。您引用的文档是指使用static关键字(即。private static $flashUtil;)定义的 变量 类,可能是来源如果您习惯于使用其他更严格类型的OOP语言进行编程,那么您会感到困惑。

答案 1 :(得分:0)

如果你想把你的类用作枚举,请使enumerationsclass为abstract:

abstract FlashBagUtil
{
    const TYPE_NOTICE = 'notice';
    ...
}

并在您的子类中使用它:

class Controller
{
    private flashType = FlashBagUtil::TYPE_NOTICE;
}

答案 2 :(得分:0)

将它作为一个类似建议的抽象类在这里得到了很多帮助,我想,因为FlashBagUtil类中有更多的东西我已经为示例代码删除了。

我的方法1有效但需要制作原始对象的副本,这违反了公共继承对象的目的。所以......

最后,我通过将命名空间导入子类并使用Ralphael建议的$flashType = FlashBagUtil::TYPE_NOTICE来确定直接访问静态内容的标准方法。在单行中从对象访问常量会很好,但这样可以很好地分离静态内容。

全儿童班:

use TreasureForge\CoreBundle\Util\FlashBagUtil;

class BatchController extends CoreController
{
    public function indexAction()
    {
        $flash = FlashBagUtil::TYPE_NOTICE;
    }
}

非常感谢您的意见。