2

我试图了解如何使用 PHP 中的关联数组和 const 构建一种知识树/本体。以下示例显示了我正在尝试做的事情:

class Fruit {
    public static $TYPES = array("APPLE" => array("GREEN" => Apple::GREEN), array("RED" => Apple::RED)); 
}

class Apple {
    public static $GREEN = array("GRANNY_SMITH" => array("FLAVOUR" => array(Flavour::SHARP, Flavour::SWEET)), 
                                 "GOLDEN_DELICIOUS" => array("FLAVOUR" => array(Flavour::SWEET, Flavour::BLAND))); 

    public static $RED = array("RED_DELICIOUS" => array("FLAVOUR" => array(Flavour::SOUR, Flavour::SHARP)), 
                               "PAULA_RED" => array("FLAVOUR" => array(Flavour::SWEET, Flavour::SOUR)));  
}

class Flavour {
    const SHARP = "sharp";
    const SWEET = "sweet";
    const SOUR = "sour";
    const BLAND = "bland";
}

从这里我希望能够检索类似的值:

$flavours = Fruit::TYPES["APPLE"]["GREEN"]["GOLDEN_DELICIOUS"];

所以基本上我得到了一个与金冠苹果相关的口味列表......有没有更好的方法来表示像这样在 PHP 中的静态数据树?在Java中我会使用枚举...

4

2 回答 2

3

回答关于不可变数组的评论:

类 ImmutableArray 扩展 ArrayObject
{
    const ERROR = '不可变数组!';

    公共函数 __construct($input, $flags = 0, $iterator_class = 'ArrayIterator') {
        父::__construct($input, $flags, $iterator_class);
    }

    公共函数 __get($key) {
        返回 $this->offsetGet($key);
    }

    公共函数 __isset($key) {
        返回 $this->offsetExists($key);
    }

    公共函数 __set($key, $value) {
        抛出新异常(self::ERROR);
    }

    公共函数 __unset($key) {
        抛出新异常(self::ERROR);
    }

    公共函数追加($值){
        抛出新异常(self::ERROR);
    }

    公共函数 asort() {
        抛出新异常(self::ERROR);
    }

    公共函数 ksort() {
        抛出新异常(self::ERROR);
    }

    公共函数 natcasesort() {
        抛出新异常(self::ERROR);
    }

    公共函数 natsort() {
        抛出新异常(self::ERROR);
    }

    公共函数 offsetSet($key, $value) {
        抛出新异常(self::ERROR);
    }

    公共函数 offsetUnset($key) {
        抛出新异常(self::ERROR);
    }

    公共函数 uasort($cmp_function) {
        抛出新异常(self::ERROR);
    }

    公共函数 uksort($cmp_function) {
        抛出新异常(self::ERROR);
    }
}
于 2012-08-08T06:45:27.033 回答
0

对于任何寻找现代 PHP 版本答案的人:因为 php 5.6 const 数组和复杂的初始化是在 PHP 中实现的。查看php 5.6 中的新功能

class Fruit {
    const TYPES = [
        "APPLE" => ["GREEN" => Apple::GREEN, "RED" => Apple::RED]
    ]; 
}

class Apple {
    const GREEN = [
        "GRANNY_SMITH" => ["FLAVOUR" => [Flavour::SHARP, Flavour::SWEET]], 
        "GOLDEN_DELICIOUS" => ["FLAVOUR" => [Flavour::SWEET, Flavour::BLAND]]
    ]; 

    const RED = [
        "RED_DELICIOUS" => ["FLAVOUR" => [Flavour::SOUR, Flavour::SHARP]], 
        "PAULA_RED" => ["FLAVOUR" => [Flavour::SWEET, Flavour::SOUR]]
    ];  
}

class Flavour {
    const SHARP = "sharp";
    const SWEET = "sweet";
    const SOUR = "sour";
    const BLAND = "bland";
}

var_dump(Fruit::TYPES["APPLE"]["GREEN"]["GOLDEN_DELICIOUS"]);

上面的代码将输出(如预期的那样):

数组(1){'FLAVOUR'=>数组(2){[0]=>字符串(5)“甜” 1 =>字符串(5)“平淡”}}

于 2015-07-20T16:42:46.717 回答