错误的方式回到交通标牌定义PHP方法是非常标准的:函数只需要名称和参数。参数是它的签名,就像这样:

function x($arg1, $arg2, $arg3) {}

参数可能在其他方面有默认值。当情况下,参数必须在签名的末尾。因此,

function goodSignature($arg1, $arg2 = 2, $arg3 = 3) {}

function badSignature($arg1, $arg2 = 2, $arg3) {}

那时,你可能是避风港’学会了什么新的。这是所有基本的PHP知识。但是,陷阱设置。

当一个人意识到PHP编译所有上述代码,良好或糟糕的语法时,陷阱被设置为运动。这是正确的,‘php -l code.php’ will say ‘test.php中没有检测到语法错误’,即使语法不起作用’t符合文件。 PHP二进制文件将接受此代码并将其转换为其可以执行的内容。

实际上,默认值机制仅在未提供参数时调用。只要伴随着所有或多个参数的方法,代码就会完美地工作:

<?php
function x($a, $b = 3, $c) { print "$a $b $c\n"; }
x(1, 2, 3);
x(1, 3);
?>
1 2 3
1 3

另一方面,如果缺少任何参数,PHP将按顺序分配值,最终缺少一个参数,然后检查是否有任何默认值,找不到第三个参数的任何一个,并发出错误。

PHP Warning: Missing argument 3 for x(), called in /test.php on line 6 and defined in /test.php on line 3

Warning: Missing argument 3 for x(), called in /test.php on line 6 and defined in /test.php on line 3

PHP Notice: Undefined variable: c in /test.php on line 3

Notice: Undefined variable: c in /test.php on line 3

如果仅提供一个参数,这将是完全相同的错误:方法签名为第二个参数提供了默认值,如果缺少此值,则使用该值。因此,仅使用一个参数调用上述函数仍会发出相同的错误:

PHP Warning: Missing argument 3 for x(), called in /test.php on line 6 and defined in /test.php on line 3

Warning: Missing argument 3 for x(), called in /test.php on line 6 and defined in /test.php on line 3

PHP Notice: Undefined variable: c in /test.php on line 3

Notice: Undefined variable: c in /test.php on line 3

怎么有人注意到这一点?要真实,所有这一切都会因为应用程序变老而发生。在某些时候,该方法需要一些升级,并添加新参数。然后,为了避免检查所有函数调用,提供了默认值。带有一些遗留代码的应用程序,先前的参数可以’T有任何默认值,所以它是以这种方式留下的。最好的部分,是没有问题的PHP将接受这个新代码。甚至可以在没有任何抱怨者的情况下运行应用程序…好吧,当然,这将是直到有人使用旧式签名。

另一个有效的困境(或不),是签名接受具有相同名称的多个参数:运行此类代码时,最后一个参数’价值将是好的。这不会引起任何错误,而不是编译,也不会在执行。

<?php
function x($a, $a , $a) { print "$a\n"; }
x(1, 2, 3);
?>
3

最后,这些是代码审查的好理由。通过读取代码,这些语法点非常容易发现。可悲的是,他们会出现在代码中。我不’认为我们需要更多地检查PHP侧:此板式是一种脚本平台,而不是编译器,这将慢,但更彻底。 PHP有一些检查,虽然只在执行时间。这是一个非常晚期的阶段:请记住,后来发现的错误,它越贵它是解决。