如何实现可以接受不同数量参数的php构造函数?
像
class Person {
function __construct() {
// some fancy implementation
}
}
$a = new Person('John');
$b = new Person('Jane', 'Doe');
$c = new Person('John', 'Doe', '25');
在php中实现这个的最佳方法是什么?
谢谢, 米洛
答案 0 :(得分:10)
一种解决方案是使用默认值:
public function __construct($name, $lastname = null, $age = 25) {
$this->name = $name;
if ($lastname !== null) {
$this->lastname = $lastname;
}
if ($age !== null) {
$this->age = $age;
}
}
第二个是接受数组,关联数组或对象(关于关联数组的例子):
public function __construct($params = array()) {
foreach ($params as $key => $value) {
$this->{$key} = $value;
}
}
但在第二种情况下,它应该像这样传递:
$x = new Person(array('name' => 'John'));
tandu指出了第三个选项:
构造函数参数的工作方式与任何其他函数的参数一样。只需指定默认值php.net/manual/en / ...或使用
func_get_args()
。
编辑:粘贴在此处,我可以通过tandu(现在:Explosion Pills)从original answer检索。
答案 1 :(得分:3)
echo '<pre>';
// option 1 - combination of both tadeck's and my previous answer
class foo {
function __construct() {
$arg_names = array('firstname', 'lastname', 'age');
$arg_list = func_get_args();
for ($i = 0; $i < func_num_args(); $i++) {
$this->{$arg_names[$i]} = $arg_list[$i];
}
}
}
$foo = new foo('John', 'Doe', 25);
print_r($foo);
// option 2 - by default, PHP lets you set arbitrary properties in objects, even
// if their classes don't have that property defined - negating the need for __set()
// you will need to set properties one by one however, rather than passing them as
// parameters
class bar {
}
$bar = new bar();
$bar->firstname = 'John';
$bar->lastname = 'Doe';
$bar->age = 25;
print_r($bar);
结果:
foo Object
(
[firstname] => John
[lastname] => Doe
[age] => 25
)
bar Object
(
[firstname] => John
[lastname] => Doe
[age] => 25
)
<?php
class Person {
function __construct() {
$arg_list = func_get_args();
echo '<p>';
for ($i = 0; $i < func_num_args(); $i++) {
echo 'Argument '.$i.' is: '.$arg_list[$i].'<br />', "\n";
}
}
}
$a = new Person('John');
$b = new Person('Jane', 'Doe');
$c = new Person('John', 'Doe', '25');
?>
结果:
Argument 0 is: John
Argument 0 is: Jane
Argument 1 is: Doe
Argument 0 is: John
Argument 1 is: Doe
Argument 2 is: 25