有没有办法强制PHP在编译时检查构造函数调用?

有没有办法强制PHP在编译时检查构造函数调用?,php,oop,Php,Oop,我最近的大部分经验都是用Java编写的,我很惊讶下面的PHP代码没有抛出编译时错误: PHP是一种类型非常松散的动态语言,它始终允许您向函数或构造函数调用传递任何集合和任何数量的参数,而不会出错,除非传递的参数不满足其定义中的类型提示;例如,这将不起作用: class Test { public function __construct(array $a, $b, $c, $d) {} } // Catchable fatal error: Argument 1 passed to T

我最近的大部分经验都是用Java编写的,我很惊讶下面的PHP代码没有抛出编译时错误:


PHP是一种类型非常松散的动态语言,它始终允许您向函数或构造函数调用传递任何集合和任何数量的参数,而不会出错,除非传递的参数不满足其定义中的类型提示;例如,这将不起作用:

class Test {
    public function __construct(array $a, $b, $c, $d) {}
}

// Catchable fatal error: Argument 1 passed to Test::__construct()
// must be an array, string given
$a = new Test('foo', true, false, 18320);
但即便如此,这也不会导致语法错误——这是运行时的致命错误


最接近的方法是在函数或方法体中执行运行时检查。

从内存中,我认为这甚至不会在运行时发出警告。谢天谢地,相反的结果会引起一个错误提供的论据太少

但是,有一种方法会引发错误:编写一个检查参数计数的构造函数。您可以为此使用和。如果您多次需要它,您可以将它放在父类中并进行扩展,当然这会排除您可能需要的任何其他继承层次结构


编辑:一个随机的灵感让我搜索“php lint”。然后呢?不过,我没有试过:)

正如博尔特钟所说,你不能

但是,如果您真的想在运行时检查这一点,可以显式声明一个默认构造函数,不带任何参数,并使用
func\u num\u args
检查有效传递的参数数量,如果适用,会引发异常

class Test
{
    public function __construct()
    {
        if( func_num_args() > 0 )
        {
            /* Error management */
        }
    }
}

谢谢让我困惑的是,我没有定义构造函数,所以我希望“调用未定义的方法”。但是我忘记了默认构造函数。@Adam Monsen:啊,这里还有一个难解的问题:PHP中没有默认构造函数!如果实例化了一个没有任何构造函数的类,那么唯一发生的事情就是内存分配。没有构造函数被调用!更多信息:@Adam Monsen:但由于PHP中的对象几乎与JavaScript中的对象一样动态且可扩展,因此您很少会遇到问题。你唯一会发现自己陷入困境的时候是在问题中描述的情况下。我只是觉得这个好奇值得一提:)哼!没有默认构造函数。我猜语言作者希望
new
即使没有构造函数也能工作,然后我猜松散的类型与任何其他函数/方法的行为类似。我想这就是为什么你甚至可以用
new
省略括号的原因,所以你会得到类似
$a=newtest+1,因为这与我的帖子基本相同,而且由于您已接近10k:)