此代码段:
unlink ('C:\dfdf.dfg', 1, 2, 3);
会崩溃,说这个功能不能接受超过2个参数(它不会引起问题,但它会强制我们准确)。 但是方法呢?
class C
{
public function b ($a)
{
}
}
$c = new C();
$c->b(1,2);
b()
会获得一个不必要的参数,甚至不会生成通知
答案 0 :(得分:1)
您的方法可以使用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);
}
..
}
答案 1 :(得分:1)
答案就在于,如果你看到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
阻止,以限制传递给您的课程的参数数量方法。我希望这清除了你的怀疑。