Php 通过另一个类变量声明一个类变量

Php 通过另一个类变量声明一个类变量,php,oop,class,php4,Php,Oop,Class,Php4,很抱歉标题含糊不清。。。我对php4类有一个难以用语言表达的问题 我的类有一个“possibleValues”数组,该数组保存关于可以从外部更改的某些属性可以接受哪些类型的值的信息。在下面的伪代码示例中,您可以看到我的属性共享相同的可接受值(颜色)。显然,我的代码中的$this->colors失败了,因为您无法通过另一个类变量定义一个类变量(可以吗?) 我如何设置一个公共颜色数组,我可以像这样引用它,这样我就不必为允许相同值的不同字段重复相同的有效选项 Class MyTest { v

很抱歉标题含糊不清。。。我对php4类有一个难以用语言表达的问题

我的类有一个“possibleValues”数组,该数组保存关于可以从外部更改的某些属性可以接受哪些类型的值的信息。在下面的伪代码示例中,您可以看到我的属性共享相同的可接受值(颜色)。显然,我的代码中的
$this->colors
失败了,因为您无法通过另一个类变量定义一个类变量(可以吗?)

我如何设置一个公共颜色数组,我可以像这样引用它,这样我就不必为允许相同值的不同字段重复相同的有效选项

Class MyTest {

    var $colors = array('red', 'yellow', 'blue');

    var $possibleValues = array(
        'someAttribute',               array(0,1),
        'someEmotions',                array('happy, 'sad'),
-->     'someColorableAttribute',      $this->colors,
-->     'someOtherColorableAttribute', $this->colors,
     );

    ...

}

为了回答您的问题,您应该在构造函数中设置变量。在PHP4中,您确实不应该使用它,构造函数应该具有类的名称

function MyTest()
{
   $this->var = $this->colors;
}

如果不想在构造函数中设置
$possibleValues
,可以尝试以下方法:

PHP4

class MyTest {
    var $colors = array('red', 'yellow', 'blue');

    var $possibleValues = array(
        'someAttribute' =>             array(0,1),
        'someEmotions'  =>             array('happy', 'sad'),
        'someColorableAttribute' =>    'colors',
        'someOtherColorableAttribute' => 'colors',
     );


    function getPossibleValues($attr) {
        //no attribute, empty list
        if (!array_key_exists($attr, $this->possibleValues))
            return array();

        $possible_values = $this->possibleValues[$attr];
        //value is a string, check for object variable with such name
        if (is_string($possible_values)) {
            if (!array_key_exists($possible_values, get_object_vars($this)))
                return array();

            return $this->$possible_values;
        }

        return $possible_values;
    }
}

$a = new MyTest();
var_dump($a->getPossibleValues('someAttribute'));
var_dump($a->getPossibleValues('someEmotions'));
var_dump($a->getPossibleValues('someColorableAttribute'));
var_dump($a->getPossibleValues('someOtherColorableAttribute'));
我使用的是
get\u object\u vars
,因为
property\u在PHP4中不存在

PHP5(类常量)


我知道,但这并不能改变我所面临的现实。那会奏效的,是的。在php5中有不同的方法吗?我觉得将一个类变量引用到另一个类变量才是真正的问题,而不是我使用的版本。有没有其他办法解决这个问题?例如,在php5中,类常量有区别吗?老实说;标准是使用构造函数(:好的,所以基本上我使用一个替代字符串来访问一个同名的类变量?我想这是可行的,但它确实感觉像是一个大工程。@kontur标准是使用构造函数或重复你自己(PHP4和PHP5)。我已经使用类常量更新了PHP5示例的答案。好的,感谢您的更新。我刚刚看到了其他示例结合了
define
serialize
,使用“常量数组”/“类变量”数组-很有趣。也很高兴知道我在php5中的选择。非常感谢您的解释-@Lusitanian的答案似乎更适合我的问题,但您的回答确实教会了我更多;)
class MyTest {
    const COLORS = 'red|yellow|blue';

    private $possibleValues = array(
        'someAttribute' =>             array(0,1),
        'someEmotions'  =>             array('happy', 'sad'),
        'someColorableAttribute' =>    self::COLORS,
        'someOtherColorableAttribute' => self::COLORS,
     );


    public function getPossibleValues($attr) {
        //no attribute, empty list
        if (!array_key_exists($attr, $this->possibleValues))
            return array();

        $possible_values = $this->possibleValues[$attr];
        //value is a string, explode it around |
        if (is_string($possible_values)) {
            return explode('|', $possible_values);
        }

        return $possible_values;
    }
}