Php,也期望方法的大多数参数


Php, expects at most parameters for methods too

这个代码片段:

unlink ('C:'dfdf.dfg', 1, 2, 3);

会分解,说这个函数不能接受超过 2 个参数(它不会引起问题,但它迫使我们精确)。但是方法呢?

class C
{
    public function b ($a)
    {
    }
}
$c = new C();
$c->b(1,2);

b()再得到一个不必要的参数,甚至不会生成通知

您的方法可以使用func_get_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;
}

在你的类中,你没有验证传递给它的arguments的数量,你可以在这里使用try, catch块来限制传递给你的类方法的参数的数量。我希望这消除了你的疑虑。

参考