Php,也最多需要方法的参数

Php,也最多需要方法的参数,php,Php,此代码段: unlink ('C:\dfdf.dfg', 1, 2, 3); 将崩溃,表示此函数不能接受超过2个参数(它不会导致问题,但它强制我们精确)。 但是方法呢 class C { public function b ($a) { } } $c = new C(); $c->b(1,2); b()再获取一个不必要的参数,甚至没有通知生成您的方法可以使用func\u get\u args接受任意数量的参数。因此PHP不会抱怨。在unlink的C实现中,PH

此代码段:

unlink ('C:\dfdf.dfg', 1, 2, 3);
将崩溃,表示此函数不能接受超过2个参数(它不会导致问题,但它强制我们精确)。 但是方法呢

class C
{
    public function b ($a)
    {
    }
}

$c = new C();
$c->b(1,2);
b()
再获取一个不必要的参数,甚至没有通知生成

您的方法可以使用
func\u get\u args
接受任意数量的参数。因此PHP不会抱怨。在
unlink
的C实现中,PHP显式验证传入参数,并在必要时抛出错误。你必须自己复制:

function b($a) {
    if (count(func_get_args()) > 1) {
        trigger_error('b() does not accept more than 1 parameter', E_USER_NOTICE);
    }
    ..
}

答案在于如果你看到php内置函数的源代码

PHP_FUNCTION(unlink)
{
char *filename;
size_t filename_len;
php_stream_wrapper *wrapper;
zval *zcontext = NULL;
php_stream_context *context = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|r", &filename, &filename_len, &zcontext) == FAILURE) {
RETURN_FALSE;
}
context = php_stream_context_from_zval(zcontext, 0);
wrapper = php_stream_locate_url_wrapper(filename, NULL, 0);
if (!wrapper || !wrapper->wops) {
php_error_docref(NULL, E_WARNING, "Unable to locate stream wrapper");
RETURN_FALSE;
}
if (!wrapper->wops->unlink) {
php_error_docref(NULL, E_WARNING, "%s does not allow unlinking", wrapper->wops->label ? wrapper->wops->label : "Wrapper");
RETURN_FALSE;
}
RETURN_BOOL(wrapper->wops->unlink(wrapper, filename, REPORT_ERRORS, context));
}
现在,仔细看看这段代码,因为它会抛出错误

if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|r", &filename, &filename_len, &zcontext) == FAILURE) {
RETURN_FALSE;
}
在类中,如果您未验证传递给它的
参数的数量,则可以在此处使用
try,catch
块来限制传递给类方法的参数数量。我希望这消除了你的疑虑


请参阅函数\u get\u args:如果要以这种方式重载方法,则由您自己的代码检查附加参数,并在需要时引发异常。。。。在一些有效的用例中,您可以选择只在函数/方法定义中包含$a,但允许传入其他参数(PHP5.6中使用variadics使这更有趣);所以PHP本身不应该在这方面给出任何通知或警告case@CD001“我不想超载,我只是想被注意到,如果我设置的参数超过了它所需的数量,那么在这种情况下,你正在重载方法-你需要告诉它抛出一个错误或抛出一个异常,如果出现这种情况,@MarkBaker在上面的评论是对金钱的猛烈抨击。”。