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

时间:2011-11-28 23:06:12

标签: php oop

我最近的大多数经验都是用Java编写的,我对以下PHP代码引发编译时错误感到非常惊讶:

<?php
class Test { }
$a = new Test('foo', true, false, 18320);

有没有办法强制这是语法或编译时错误?

3 个答案:

答案 0 :(得分:4)

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);

但即便如此,这也不会导致语法错误 - 这是运行时的致命错误。

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

答案 1 :(得分:1)

从内存来看,我认为这甚至不会在运行时发出警告。谢天谢地,反过来会产生错误! - 提供的论点太少了。

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

编辑:一个随机的灵感让我搜索“php lint”。 guess what I found?不过尝试过,但是:)

答案 2 :(得分:1)

正如BoltClock所说,你不能......

但是如果你真的想在运行时检查它,你可以显式地声明一个默认的构造函数,不带参数,并使用func_num_args来检查有效传递的参数的数量,如果适用则引发异常。

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