【问题标题】:Constant defined inside function is not acceible via class name please see code函数内部定义的常量不能通过类名访问,请参见代码
【发布时间】:2013-10-31 02:58:17
【问题描述】:

这里的常量是在函数内部动态定义的,我无法使用类名访问它,我想通过类名访问它。 我在函数中的常量来自 Db,我正在从 db 生成常量,我想用类名访问它们请告诉我如何使用“定义”来使常量或类也可用

我的班级{ 公共函数getsettings(){ 定义('我的常量','值'); } } 回声 MyClass::myconstant;

【问题讨论】:

  • 为什么在类中使用常量?你知道你可以使用类属性吗?!
  • 在一个类中使用类常量而不是全局常量是最明智的
  • 我怎样才能使类常量?
  • @Jabeen 检查我的更新答案。

标签: php class oop


【解决方案1】:

函数define() 将为全局范围定义常量,无论你在哪里调用它——它与任何类或它的上下文无关。要定义class constant,你应该使用const关键字:

class MyClass 
{
    const myconstant = 'values';
    //..
}

【讨论】:

  • 我必须从数据库中获取常量并使用此类生成
  • 所以这不是一个常数 - 根据定义。常量是……嗯,常量,而不是可以是动态的并且取决于运行时条件的东西。您的案例将是类财产。
  • 实际上我的数据库中存在常量列表,我必须获取并生成这些常量,我正在使用类内的函数执行此操作,但无法使用类名访问
  • 这仍然违反了常数的逻辑意义。常量不是你应该在运行时定义的东西(一般来说,即使define() 函数也不好)。您可以改用静态公共属性 - 这将是最好的解决方案。
  • 实际上我有一些限制,为什么我想这样做。我的老板希望他们在现有项目中的变化最小的情况下保持活力。
【解决方案2】:

要获得存在的myconstant,您需要调用函数getsettings()

此后myconstant 将成为一个全局常量,但不会成为该类的一部分,即MyClass

使用以下代码:

class MyClass {
    public function getsettings(){
        define('myconstant','values');
    }
}
$obj=new MyClass;
$obj->getsettings();
echo myconstant;// prints 'values' as you need.

现在,如果您想将常量用作与类名关联,那么您必须const-keyword 声明该常量

但在这种情况下您必须在声明该常量时为其分配一个静态值。因此,在您的目的中您不能使用const,因为您希望动态地将从数据库中检索到的值分配给常量。因此你必须使用我在回答中已经给出的define()的语法。

我的建议

出于您的目的,我建议您使用带有private 访问说明符和static 修饰符的变量,而不是constant。在这种情况下,您将被允许以特权方式访问或修改它们,即仅从 基类 内部。

这实际上是 OOP 的需要,即强调数据的安全性(即在 private 访问说明符方面)。

示例代码

class MyClass {
    private static $constant;
    public function getsettings(){
        //code to access database values...
        self::$constant=$database_val; //$database_val is assigned with values from the database
    }
    public function return_constant()
    {
        return self::$constant;
    }
}
$obj=new MyClass;
$obj->getsettings();
echo $obj->return_constant();

【讨论】:

  • 还有没有其他可能使用类名的常量?
  • 你的第二个建议
  • @RajeshPaul 这也是对 OOP 的完全滥用:为什么 getsettings() 是实例方法?为什么调用一个方法return_constant,它可能返回不同的值[NULL如果在getsettings之前调用,另一个值如果在之后调用]?如果需要,只需在对象构造函数中注入参数:在这种情况下,依赖注入是要走的路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多