如何改善我的尝试:
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循环中构造。我很抱歉不清楚。
答案 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;
}