最近面試中被問到include和require區別,現在總結一下。
先上官方手冊鎮樓:
然後再對網上的各種謠言一一論證。
謠言一:include有返回值,而require沒有
驗證代碼:
<?php
$res1 = require 'foo1.php';
$res2 = include 'foo2.php';
var_dump($res1, $res2);
執行結果:
[root@zhangyi php]# php bar.php
int(1)
int(1)
再看另一種情況,foo1.php 和 foo2.php 中都是直接return的:
foo1.php:
<?php
return new stdClass();
foo2.php:
<?php
return [
'host' => 'localhost',
'port' => 3306,
];
再看上面的bar.php的執行結果:
[root@zhangyi php]# php bar.php
object(stdClass)#1 (0) {
}
array(2) {
["host"]=>
string(9) "localhost"
["port"]=>
int(3306)
}
謠言二:include()是有條件包含函數,而 require()則是無條件包含函數
先簡單解釋下,大概意思是說,放在if判斷裏的include()會受if的判斷結果而執行或不執行,但require則一定會執行。
foo1.php:
<?php
$res1 = max(1, 3);
foo2.php:
<?php
$res2 = [
'host' => 'localhost',
'port' => 3306,
];
bar.php:
<?php
if (time() % 2) {
require('foo1.php');
include('foo2.php');
}
var_dump($res1, $res2);
多次執行bar.php 看結果:
[root@zhangyi php]# php bar.php
PHP Notice: Undefined variable: res1 in /root/php/bar.php on line 6
PHP Notice: Undefined variable: res2 in /root/php/bar.php on line 6
NULL
NULL
[root@zhangyi php]# php bar.php
int(3)
array(2) {
["host"]=>
string(9) "localhost"
["port"]=>
int(3306)
}
[root@zhangyi php]# php bar.php
int(3)
array(2) {
["host"]=>
string(9) "localhost"
["port"]=>
int(3306)
}
[root@zhangyi php]# php bar.php
PHP Notice: Undefined variable: res1 in /root/php/bar.php on line 6
PHP Notice: Undefined variable: res2 in /root/php/bar.php on line 6
NULL
NULL
不帶()的 require 和 include結果一樣,大家可以自己嘗試一下。
謠言三:require通常放在PHP程序的最前面,PHP程序在執行前,就會先讀入require所指定引入的文件,使它變成PHP程序網頁的一部份。常用的函數,亦可以這個方法將它引入網頁中。include一般是放在流程控制的處理部分中PHP程序網頁在讀到include的文件時,纔將它讀進來。這種方式可以把程序執行時的流程簡單化。
不知道說的是啥,就不驗證了。
我目前正在翻譯MySQL8.0的官方文檔,有興趣的可以來看看或者參與進來:https://github.com/zhyee/Mysql8.0_Reference_Manual_Translation