在构造函数之后设置类常量?

时间:2011-03-22 09:51:47

标签: php oop class

我有一个具有以下架构的课程

class MyClass
{
   const x = 'abc';
   const y = '123';

   function _contruct() {}
}

有没有办法让我在类体中保持未设置的常量,并在调用构造函数后动态设置?例如:

class MyClass
{
   const x;
   const y;

   function _contruct()
   {
      $this->setStuff();
   }

   function setStuff()
   {
     $this->x = Config::getX();
     $this->y = Config::getY();
   }
}

5 个答案:

答案 0 :(得分:9)

  

顾名思义,这个价值   在执行期间无法改变   脚本(魔法除外)   常数,实际上并非如此   常数)(http://php.net/manual/en/language.constants.php

所以,不。你可以把它们变成私人变种。

答案 1 :(得分:5)

没有。类常量(以及使用const关键字定义的全局或名称空间常量)必须是文字值,必须在运行时之前设置。这就是它们与运行时设置的旧学校define()常量的不同之处。在执行脚本期间无法更改或设置const常量。

  

该值必须是常量   表达,而不是(例如)a   变量,属性,结果   数学运算或函数   调用

来自PHP手册:Class Constants

这是可能的:

define('MY_CONST', someFunctionThatReturnsAValue());

但那不是:

const MY_CONST = someFunctionThatReturnsAValue();

// or

class MyClass {
    const MY_CONST = = someFunctionThatReturnsAValue();
}

// or

namespace MyNamespace;
const MY_CONST = someFunctionThatReturnsAValue();

在示例中使用$this可能会假设您尝试在实例级别设置常量,但类常量始终在类级别上静态定义。

答案 2 :(得分:3)

不,常量是常量,因为它们应该是常量。首先使用空值声明它们并使用其他值有效地更改这些值意味着它们是可变的。由于您的目标似乎是设置它们一次,但不是之后,请考虑构造函数注入,例如

class MyClass
{
    private $x;
    private $y;
    public function __construct($x, $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
}

只要您的类没有公开任何修改$x$y的方法,并且您没有在内部进行修改,它们实际上是不变的。对于非公共变量,你唯一不能做的就是MyClass::X,但我认为你不应该在各自的类之外使用类常量,因为它引入了消费者和类之间的耦合。

这很简单。

答案 3 :(得分:1)

常量“常数”。你不能改变它。

您可以使用变量。

答案 4 :(得分:1)

不可能。如果你可以在setStuff()中设置x和y,你也可以(重新)在任何其他方法中设置它们。根据定义,常量不能改变。因此,你的x和y将是变量,而不是常量。