这个代码片段:
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
块来限制传递给你的类方法的参数的数量。我希望这消除了你的疑虑。
参考