return / include / require / require_once() / include_once()/ goto
return
如果在一个函数中调用 return()语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return()也会终止 eval() 语句或者脚本文件的执行。
如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include() 的或者 require()的,则控制交回调用文件。此外,如果当前脚本是被 include()的,则 return() 的值会被当作 include()调用的返回值。如果在主脚本文件中调用 return(),则脚本中止运行。如果当前脚本文件是在 php.ini中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。
Note: 注意既然 return()是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。
Note: 当用引用返回值时永远不要使用括号,这样行不通。只能通过引用返回变量,而不是语句的结果。如果使用 return ($a); 时其实不是返回一个变量,而是表达式 ($a) 的值(当然,此时该值也正是 $a 的值)。
include
include() 语句包含并运行指定文件。
以下文档也适用于 require()。这两种结构除了在如何处理失败之外完全一样。include()产生一个警告而 require() 则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用 require()。include()就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。注意在 PHP 4.3.5 之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。
寻找包含文件的顺序先是在当前工作目录的相对的 include_path 下寻找,然后是当前运行脚本所在目录相对的 include_path 下寻找。例如 include_path 是 .,当前工作目录是 /www/,脚本中要 include 一个 include/a.php 并且在该文件中有一句 include "b.php",则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果文件名以 ./ 或者 ../ 开始,则只在当前工作目录相对的 include_path 下寻找。
当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。
vars.php
$color = '红';
$fruit = '苹果';
?>
test.php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A 红 苹果
?>
如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。
function foo()
{
global $color;
include 'vars.php';
echo "A $color $fruit";
}
foo(); // A 红 苹果
echo "A $color $fruit"; // A
?>
当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中应被当作 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中。
处理返回值:可以在被包括的文件中使用 return()语句来终止该文件中程序的执行并返回调用它的脚本。同样也可以从被包含的文件中返回值。可以像普通函数一样获得 include 调用的返回值。不过这在包含远程文件时却不行,除非远程文件的输出具有合法的 PHP 开始和结束标记(如同任何本地文件一样)。可以在标记内定义所需的变量,该变量在文件被包含的位置之后就可用了。
因为 include() 是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意。
// 错误
if (include('vars.php') == 'OK') {
echo 'OK';
}
// 正常
if ((include 'vars.php') == 'OK') {
echo 'OK';
}
?>
return.php
$var = 'PHP';
return $var;
?>
noreturn.php
$var = 'PHP';
?>
testreturns.php
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1
?>
$bar 的值为 1 是因为 include 成功运行了。注意以上例子中的区别。第一个在被包含的文件中用了 return() 而另一个没有。如果文件不能被包含,则返回 FALSE 并发出一个 E_WARNING 警告。
如果在包含文件中定义有函数,这些函数可以独立于是否在 return() 之前还是之后在主文件中使用。如果文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 在 return() 之后不会抱怨函数已定义。推荐使用 include_once() 而不是检查文件是否已包含并在包含文件中有条件返回。
另一个将 PHP 文件“包含”到一个变量中的方法是用输出控制函数结合 include() 来捕获其输出,例如:
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}
?>
Note: 因为是一个语言构造器而不是一个函数,不能被可变函数 调用。
require
require() 语句包含并运行指定文件。
require() 和 include()几乎完全一样,除了处理失败的方式不同之外。include() 产生一个Warning而 require()则导致一个Fatal Error。换句话说,如果想在丢失文件时停止处理页面,那就别犹豫了,用 require() 吧。include()就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。
require 'xlxz.php';
require $xlxzfile;
require ('xlxz.txt');
?>
require_once()
require_once() 语句在脚本执行期间包含并运行指定文件。此行为和 require()语句完全相同,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。
请参看 include_once() 的详细文档来理解 _once 的含义, 理解与没有 _once 时候有什么不同。
include_once()
The include_once() 语句在脚本执行期间包含并运行指定文件。此行为和 include()语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。
include_once()应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
返回值和 include() 相同。如果文件已被包含,本函数返回 TRUE。
goto
goto操作符可以用来跳转到程序中的某一指定位置。该目标位置可以用目标名称 加上冒号来标记。PHP中的goto有一定限制,只能在同一个文件和作用域中跳转, 也就是说你无法跳出一个函数或类方法,也无法跳入到另一个函数。你也无法跳入到任何循环或者switch结构中。常见的用法是用来跳出循环或者switch,可以代替多层的break。
goto a;
echo 'Foo';
a:
echo 'Bar'; // Foo 不会被输出
?>
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17'; // j hit 17
?>
Note:
The goto 操作符仅在 PHP 5.3及以上版本有效.