可以在PHP中自动初始化类变量吗?

时间:2010-06-30 05:28:44

标签: php types

嘿,大家好。我找不到任何谷歌搜索这个问题,我之前已经找到了关于SO的一些问题的非常好的答案,所以我借这个借口加入社区。

我正在为我正在处理的PHP项目创建类的层次结构,并且我希望在构造函数中初始化的类中有一些变量,而不显式编写初始化代码。具体来说,我希望解释器假设某些变量实际上是指向某个类的指针。如果我可以做一些类似C结构的东西,那将非常接近我想要的东西。

到目前为止,我唯一想到的是在自己的名称中明确声明变量类型,并让类在每个上调用初始化函数,例如;

class A{
  ...
}

class B{
  var $x_A;

  function initVar($var){
    list($varname, $vartype) = split('_',$var);
    $this->$var = new $vartype();
  }

}

B的构造函数在initVar的所有get_class_vars(get_class($this))上调用{{1}},所以从它继承的任何东西都会以相同的方式进行初始化;显然包括检查变量名称,检查类是否存在,以及比单个下划线更好的分离方案。我只是不禁认为有一种更好的方法可以将初始化硬编码到构造函数中。

如果有人知道更好的方法,我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你的方法可能会有效,但实际使用它可能会非常烦人。例如,想象一下必须始终引用这些变量:

$myObject->account_ServiceAccountType

如果您真的想要使用这样的东西,也许映射变量可能很有用:

class B {
    public $x, $account;

    private $map = array(
        'x' => 'A',
        'account' => 'ServiceAccountType'
    );

    public function __construct() {
        foreach ($this->map as $var => $class) {
            $this->$var = new $class;
        }
    }
}

你也可以尝试这种方法。它使用PHP的神奇__get函数。

class B {
    private $map = array(
        'x' => 'A',
        'account' => 'ServiceAccountType'
    );
    private $vars;
    public function __construct() {
        $this->vars = array();
        foreach ($this->map as $var => $class) {
            $this->vars[$var] = new $class;
        }
    }

    public function __get($v) {
        return $this->vars[$v];
    }
}

请注意,您不需要使用此方法两次定义类成员。