如何在类中创建常量实例数组?

3
我正在创建自己的PHP类。我希望在该类中有该类实例的常量引用,就像枚举一样。
我一直收到两个错误: 1. 常量不能是数组 2. 第11行解析错误(见下文)
怎么回事?我真的不能有一个常量数组吗?我的背景是Java...
下面是我的代码:
class Suit {
    const SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade");
    const COLOURS = array("red", "black");

    const CLUB = new Suit("Club", "black");        // LINE 11
    const DIAMOND = new Suit("Diamond", "red");
    const HEART = new Suit("Heart", "red");
    const SPADE = new Suit("Spade", "black");

    var $colour = "";
    var $name = "";

    function __construct($name, $colour) {
        if (!in_array(self::SUIT_NAMES, $name)) {
            throw new Exception("Suit Exception: invalid suit name.");
        }
        if (!in_array(self::COLOURS, $colour)) {
            throw new Exception("Suit Exception: invalid colour.");
        }
        $this->name = $name;
        $this->colour = $colour;
    }
}

我也想念枚举类型... - SparK
1个回答

3

更新:

从PHP 5.6开始,可以定义类型为arrayconst

从PHP 7.1开始,也可以定义常量的可见性(之前总是公开的)。

原始答案:

在PHP中,既不能将数组赋值给常量,也不能将对象赋值给常量。 文档指出它必须是“常量表达式”。我不知道他们是否定义了这个术语,但他们指出它不包括“变量、属性、数学运算结果或函数调用。”

构造函数调用也不被允许,这并不令人意外,虽然array并不是真正的函数,但它是“类似于函数”的。

可能你需要像下面这样使用一个解决方法。我们使用private static代替实际的常量。这意味着您需要手动避免重新分配,并且如果需要,必须提供getter(getClub等,命名由您决定)。

另外,由于无法将对象分配给static,而PHP没有静态初始化程序,因此我们在构造函数中按需初始化。

一个不相关的问题是您使用了错误的in_array

class Suit {
    private static $CLUB, $DIAMOND, $HEART, $SPADE;
    private static $SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade");
    private static $COLOURS = array("red", "black");

    private static $initialized = false;

    function __construct($name, $colour) {
        if(!self::$initialized)
        {
            self::$CLUB = new Suit("Club", "black");
            self::$DIAMOND = new Suit("Diamond", "red");
            self::$HEART = new Suit("Heart", "red");
            self::$SPADE = new Suit("Spade", "black");
            self::$initialized = true;
        }

        if (!in_array($name, self::$SUIT_NAMES)) {
            throw new Exception("Suit Exception: invalid suit name.");
        }
        if (!in_array($colour, self::$COLOURS)) {
            throw new Exception("Suit Exception: invalid colour.");
        }
        $this->name = $name;
        $this->colour = $colour;
    }
}

有什么解决办法吗?如果没有这个,我的程序会变得相当困难 :X 而且用其他方式做对我来说没有意义...静态的呢?同样的情况吗? - Lindz
您的代码存在无限循环。在初始化静态属性之前,将initialized设置为true。 - Simon Backx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接