我有这样的功能。
function load($name, $arg1, $arg2, $arg3, $arg4){
$this->$name = new $name($arg1, $arg2, $arg3, $arg4);
}
load()
方法将加载一些类并将其设置为类property
,无限参数取决于它们分配的类。
另一个例子,如果我只用3参数设置方法$this->load
,这将在过程中发生什么
function load($name, $arg1, $arg2){
$this->$name = new $name($arg1, $arg2);
}
有可能做类似的事吗?
答案 0 :(得分:6)
您可以使用func_get_args()
,ReflectionClass
的组合以及this comment的帮助:
function load(){
$args = func_get_args();
if( !count( $args)){
throw new Something();
}
$name = array_shift( $args);
$class = new ReflectionClass($name);
$this->$name = $class->newInstanceArgs($args);
}
答案 1 :(得分:3)
更简单的处理方法是为$arg
变量使用数组。动态调用其他构造函数(new $name()
)然后需要接受一个数组作为它们的输入,你可以简单地传递参数数组:
// Params in an array
$params = array(1,2,3,4,5);
// Pass into the load() function
function load($name, $params) {
// And pass them through to the dynamic constructor
$this->$name = new $name($params);
}
答案 2 :(得分:2)
除非在参数上设置默认值,否则必须在调用函数时传入值:
function load($name, $arg1, $arg2, $arg3, $arg4){
load('x'); // fails, didn't specify args 1->4
但有默认值:
function load($name, $arg1, $arg2 = null, $arg3 = null, $arg4 = null){
load('x', 'y'); // works, args 2->4 are optional
load('x'); // fails, didn't specify arg1
load('x', 'y', 'z'); // works, args 3->4 are null.
还有其他选项 - 在数组中传入选项参数,或使用func_get_arg()
function load($name) {
load('x', 'y', 'z') // not an error, use func_get_args/func_num_args to get the extras
答案 3 :(得分:1)
func_get_args()可能就是你要找的东西。来自PHP文档:
<?php
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "<br />\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
}
}
foo(1, 2, 3);
?>
以上示例将输出:
Number of arguments: 3<br />
Second argument is: 2<br />
Argument 0 is: 1<br />
Argument 1 is: 2<br />
Argument 2 is: 3<br />
答案 4 :(得分:1)
有一种方法可以在PHP中使用真正可变大小的参数定义函数。您需要在函数中使用func_get_args
函数:
function load() {
$args = fnc_get_args();
$name = $args[0];
$arg1 = $args[1];
...
}
然后您需要确定接下来要拨打什么/如何拨打电话。