我发布这个是因为它在Google或php.net上并不明显
==> 请使用 PHP 语言演示正确声明函数的语法的几个示例。
例如(在C ++中):
int foo(); // forward declaration
int x = foo(); // calling the function.
int foo() // the actual implementation
{
return 5;
}
这在PHP中看起来如何?多个参数怎么样?默认参数怎么样?最佳做法是什么?为什么?
答案 0 :(得分:8)
你不需要在PHP中进行前向声明,而是需要在当前脚本中声明函数(即使它是在调用之后),或者在任何包含/必需的脚本中,给出include / require在调用函数之前执行语句。
没有前瞻声明。
如果在当前脚本上,即使在最后,在调用之后:它'ok
如果当前脚本在脚本INCLUDEd / REQUIREd上,则应在调用函数之前执行INCLUDE / REQUIRE语句。
如果它在一个脚本上包含/请求当前脚本:它没问题(即使在INCLUDE / REQUIRE语句之后声明)
答案 1 :(得分:3)
不仅仅是......
$x = foo();
function foo() {
return 5;
}
echo $x; //echos "5"
答案 2 :(得分:3)
我会说所要求的例子不是最好的证明前向声明的必要性。比如说,我们需要以下内容:
function foo($n) {
echo 'Foo';
if($n>0) bar($n-1);
}
function bar($n) {
echo 'Bar';
if($n>0) foo($n-1);
}
foo(200);
上面的代码在PHP中完美运行,尽管 foo 中的“未定义”功能 bar 。似乎PHP在调用时检查函数定义。
所以答案是:
答案 3 :(得分:2)
PHP不会执行转发函数声明(或“函数原型设计*)。我们最接近的是对象接口和抽象方法这些被称为“方法原型”或“方法声明”(声明而不是定义,它带有c风格的语义)
Interface MyWidgetInterface {
function calculateThings(SomeClass $foo);
}
Abstract Class MyAbsClass {
public abstract function sayHello();
}
Class MyObj Extends MyAbsClass Implements MyWidgetInterface {
public function calculateThings(SomeClass $foo) {
}
public function sayHello() {
echo "Hi!\n";
}
}
$thing = new MyObj();
$thing->sayHello();
我们没有/需要转发声明函数的原因之一是php每次编译它时都会解析你的脚本。它在开始执行文件之前找到你的函数,因此它知道它们在那里。事实上,我不记得在调用之前你必须要多远才能定义函数。我已经做了9年的PHP,它从来不需要: - )
答案 4 :(得分:0)
如果你希望函数在PHP中返回某个类型的值,你可以使用类似的东西。
function foo($param) {
// code
return (int) $param; // or (string), (float)
}
或者,当您访问该功能时:
$x = (int) foo($param);
答案 5 :(得分:0)
参考你可以这样做的默认参数
function foo( $param1="value1" , $param2="value2" ){
echo $param1." ".$param2;
}
foo();
foo("not default","not default");
foo(NULL,"not default");