如何编写一个构造函数来初始化类字段而不对字段名称进行硬编码

时间:2011-04-09 20:43:04

标签: php constructor

如何改善我的尝试:

class gotClass {
    protected $alpha;
    protected $beta;
    protected $gamma;
    (...)

    function __construct($arg1, $arg2, $arg3, $arg4) {
        $this->alpha = $arg1;
        $this->beta = $arg2;
        $this->gamma = $arg3;
        (...)
    }
}

一些好的和紧凑的(编辑以回应评论)

class gotClass {
        protected $alpha;
        protected $beta;
        protected $gamma;
        (...)

    function __construct($alpha, $beta, $gamma) {
        $functionArguments = func_get_args();
        $className = get_called_class();
        $classAttributes = get_class_vars($className);
        foreach ($functionArguments as $arg => $value)
            if (array_key_exists($arg, $classAttributes))
                $this->$arg = $value;
}

我无法使用它,我不知道正确使用的功能。我是否提到我是PHP的新手?非常感谢您的帮助。

编辑:字段名称不符合未经编辑的帖子可能建议的任何模式。所以他们的名字不能在某些field [i] -like循环中构造。我很抱歉不清楚。

2 个答案:

答案 0 :(得分:2)

  

评论后编辑:PHP缺乏对命名参数的支持(这将完全解决这个问题)是一件非常遗憾的事情。根据我的经验,只要没有问题的原生解决方案,为了在IDE中自动生成文档和查找功能,最好分别声明每个参数。只有在显式声明它们时,IDE才能显示预期的参数。

     

请参阅this SO question了解该问题的另一种流行解决方法。

如果您需要仍然执行此操作,则需要func_get_args()来检索传递给构造函数的所有参数,以及一个用于映射属性名称的数组。

这样的东西
private $fields = array("alpha", "beta", "gamma");

function __construct()
 { 
   $args = func_get_args();
   foreach ($args as $index => $arg)
    { $this->{($this->fields[index])} = $arg; }
 }

这不会检查指定的变量是否存在 - 可能会添加更多关于确切需要检查的详细信息。

答案 1 :(得分:0)

你有语法错误,这个

foreach ($args as $arg -> $value)

应该是

foreach ($args as $arg => $value)

在第一个示例中,您需要调用

new gotClass($a, $b, $c)

但是在你的第二个例子中,你期望一个数组作为参数,所以你需要做

new gotClass(array($a, $b, $c))

您可能需要转换并使用func_get_args(),使用这将意味着以下格式仍然可以使用

new gotClass($a, $b, $c) 

function __construct() {
    $className = get_called_class();
    $classAttributes = get_class_vars($className);
    foreach (func_get_args() as $arg -> $value)
        if (array_key_exists($arg, $classAttributes))
            $this->$arg = $value;
}