【问题标题】:How to override a class constant in PHP?如何覆盖 PHP 中的类常量?
【发布时间】:2015-02-23 03:21:40
【问题描述】:

在使用常量时,我​​总是尝试定义如下常量,以允许最终用户覆盖其值。

if ( ! defined( 'MY_CONST' ) )
    define ( 'MY_CONST', 10 );

我现在已经开始使用类 (OOP),并且想知道是否有一种方法可以定义一个允许最终用户覆盖该值的类常量?

参考:

【问题讨论】:

  • 您知道在您向我们展示的示例中您不会覆盖未定义的常量吗?
  • 您是在询问最终用户是否可以覆盖类常量,还是希望允许最终用户覆盖它?
  • 也许您应该解释一下“最终用户”是什么意思。如果是关于具有不同状态的库,那么普通变量通常更合适。
  • 最终用户是指我的代码的用户。例如,用户 A 下载我的项目以在他们自己的项目中使用。很抱歉没有说得更清楚。

标签: php oop constants


【解决方案1】:

如果您的用户正在扩展您的类,他们可以重新定义常量就好了:

class Foo extends Bar {
    const BAZ = 42;
}

Bar 是否已经定义了 BAZ 常量并不重要。您在代码中所要做的就是确保您使用后期静态绑定来引用“当前类”常量:

public function useConst() {
    echo static::BAZ;
}

否则,您可以选择这样做:

if (!defined('BAZ')) {
    define('BAZ', 42);
}

class Bar {
    const BAZ = BAZ;
}

虽然这不是很优雅。您应该在类上使用 getter 和 setter 来允许配置,而不是为此使用常量:

Bar::setBaz(42);

【讨论】:

  • “你应该在你的类上使用 getter 和 setter 来允许配置”我同意... 可以使用常量作为 var 名称(如 PDO::setAttribute):Bar::setOption(Bar::BAZ, 42),具体取决于关于你正在实施什么,这可能是一个好主意。
  • 确实如此。如果内容具有延展性,则它可能不是常量。 :o)
  • 尽管它是最优雅的选择,但我不确定我的用户是否愿意扩展类。我认为不太优雅的选项在我的情况下是最实用的。感谢您突出显示我的可用选项 - 非常感谢!
  • FWIW,作为您的代码的潜在最终用户,我不希望使用 define() 类常量设置常量,但是保存应用程序配置值的设置/配置对象,然后可以访问和最好注入你的班级或我的班级。特别是如果这是一个库或组件,而不是应用程序或框架。
  • @user2839497 嗯,常量不会改变,只是不同的类可能有不同的值。这对于诸如 UserRecord::TABLE = 'users' 之类的 Active Record 类型类是合理的。
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2010-10-20
  • 2022-01-24
  • 2011-03-11
  • 2012-11-16
  • 2021-12-27
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多