require和include区别
区别主要表现在两个方面:1 加载失败时如何处理; 2 加载重复时如何处理
require()和include()语句是语言结构,不是真正的函数,可以像php中其他的语言结构一样,例如echo()可以使用echo("abc")形式;
require()和include()也可以不加圆括号而直接加参数。
include()产生一个警告而require() 则导致一个致命错误。换句话说,如果你想在遇到丢失文件时停止处理页面就用require()。
include()就不是这样,脚本会继续运行。
require执行效率高
require_once()
include_once()
该文件中的代码被包括了则不会再包括
require_once "file.txt";
require_once "file.txt"; //不会再包括
对于被包含的文件中有自定义函数, 多次加载文件就会出现错误;
解决方法:使用 require_once()和include_once()
require是在PHP脚本引擎编译的时候就载入的, 而include是条件执行, 当代码执行到那一行时才包含。
include()是有条件包含函数, 而require()则是无条件包含函数。
例如:如果变量$somg为真, 则将包含文件somefile.php
if($some){
include 'somefile.php';
}
但无论$some取何值, 下面的代码将把文件somefile.php包含进文件里
if($something){
require 'somefile.php';
}
例如: 充分说明了这两个函数之间的不同:
$i = 1;
while ($i < 3) {
require "somefile.$i.php";
$i++;
}
可以从以上这段代码中看出, 每一次循环的时候, 程序都将把同一个文件包含进去, 很显然这不是我们想要的。
我们希望在每次循环时, 将不同的文件包含进来, 如果要完成这个功能, 只能使用函数include():
$i = 1;
while ($i < 3) {
include "somefile.$i.php";
$i++;
}
include和require加载文件不会对header()函数产生影响
如果加载文件里含有header()函数的代码, 则不会产生错误;
one.php
<?php
header("Content-type:text/html;charset=utf-8");
session_start();
echo "这是第一个脚本文本";
$_SESSION['username'] = "汪娜娜";
include "two.php";
?>
two.php
<?php
header("Content-type:text/html; charset=utf-8");//可以在被加载的文件重新设置一个响应头信息
//session_start(); 不能加载第二个
echo "<br>";
echo $_SESSION['username'];
echo "<br>";
echo "这是第二个脚本文件";
?>
加载中的文件路径问题
通常,文件的路径应该给定,并且有一个明确的位置,主要有以下三种情况:
相对路径:
/ 根路径(网站域名所指向的路径)
include和require不支持根路径(PHP不支持以"/"开头的路径, 除非两个文件都在根路径下, 使用根路径加载文件时不会出现错误)
./ 当前文件位置
../ 当前文件位置的"上一级"位置
注意:"上一级"的位置,最终也不能超出当前站点所在目录;
相对路径一定就是以该两个特殊符号为"开始"
加载后的子模板的路径问题:
子模板要想在父模板中显示, 必须以父模板为基准点
如:网站根目录下有三个文件
index.php
view/index.html
public/public.css
index.php加载view/index.html
而index.html在加载public/public.css
要想在index.php中生效 则index.html路径必须以index.php为基准点
<link rel='stylesheet' type="text/css" href="public/public.css">应当这样写
绝对路径:
本地绝对路径:c:/abc/def/
网络绝对路径:http://www.abc.com/dir/
当我们在加载文件时,没有给定路径信息(即只给定了文件名), 此时,机制就比较复杂了(虽然我们不推荐这么做):
此时, PHP会按如下顺序依次去找该文件:
?先在include_path设定的目录中找(include_path是一个php.ini的配置项,里面可以设定多个目录位置)。
?没找到,则在当前网页文件所在目录中找(当前工作目录)
?没找到,则在当前include命令所在文件的目录中找
;include_path = ".;c:\php\includes"
这里设置了两个路径: "." 表示当前路径 "c:\php\includes" 表示当前网页所在的路径
上述后两个位置,通常其实是"一致的",只有出现"文件嵌套包含"的时候,才可能会出现不一致(在修改配置文件php.ini中include_path的值时)。
在实际应用中,
首先,不推荐不指定文件路径。
其次,通常会获取到站点的物理路径,然后以此为"起点"去定位各个文件的位置。比如:
define("ROOT", $_SERVER['DOCUMENT_ROOT'] . "/"); //站点跟目录
define("PULIC", ROOT . "public/"); //通常用于定义一个存放公共函数的目录
define("UPLOAD",ROOT . 'upload/"); //用于存放用户上传的文件
如果要在page1.php中,引入一个函数库文件(func1.php),则可以这样:
include PULIC . 'func1.php'; //这里用的就是绝对路径。
又比如要在dir/page2.php中,引入该函数库文件(func1.php),则可以:
include PULIC . 'func1.php';
加载文件
require_once __DIR__ . '/composer' . '/autoload_real.php';
__DIR__能够解决框架内加载问题