首先是一些代码...
包含常量的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是在此上下文中访问静态内容的唯一且最干净的方法吗?
答案 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;
}
}
非常感谢您的意见。