6.PHP包含檔案、終止指令碼、陣列指標

渲染流星的顏色發表於2018-12-24
1.包含檔案

在網站中有相同的banner,版權等等頁面,我們可以將相同的頁面做成包含檔案,在展示的頁面中包含即可。

包含檔案相當於將檔案的內容複製到頁面中,如果包含檔案有
頁面結構(),包含後,頁面中就不止一個頁面結構了。這與W3C定義的規範不符合,所以在包含檔案中不能出現頁面的結構。

a.路徑
  • 相對路徑:以自身的所在的目錄為參照
  • 絕對路徑:以碟符或者站點根目錄為參照
相對路徑比較簡潔,但可能由於頁面之間多次相互包含,地址因此會出現問題。這種情況下,建議使用絕對路徑。
複製程式碼
//相對路徑
<img src="img.png" />
<img src="./img.png" />
<img src="../img.png" />

//絕對路徑
<img src="c:htdocsimg.png" />
<img src="/images/img.png" />
複製程式碼
  • ../ 上一級目錄
  • ./ 當前目錄
  • 在html頁面中/表示根目錄。
b.包含檔案語法
  • include():可以包含多次
  • require():可以包含多次
  • include_once():只能包含一次
  • require_once():只能包含一次
echo `include`.`<br>`;//可以包含多次
include `head.html`;

echo `require`.`<br>`;//可以包含多次
require `head.html`;

echo `include_once`.`<br>`;//只能包含一次
include_once `head.html`;

echo `require_once`.`<br>`;//只能包含一次
require_once `head.html`;
複製程式碼

++包含檔案如果是html頁面,在包含檔案中有PHP程式碼,包含檔案中的PHP程式碼是可以被解析的++

c.require和include的區別
  • 相同點:可以包含多次
  • 不同點:++require遇到錯誤停止執行,include遇到錯誤繼續執行。++
思考:在專案中我們是選用require(include)還是選擇require_once (include_once)?
答:選擇require(include),require_once()在包含之前先要判斷一下此檔案是否被包含,如果沒有包含則包含,否則不包含,在效率上顯然沒有requrie高。
複製程式碼

包含檔案相當於拷貝包含檔案的程式碼複製主檔案中,魔術常量除外,魔術常量取的是魔術常量所在檔案的資訊。

echo __FILE__,`<br>`;
echo __LINE__,`<br>`;

index.php>head.html

F:ServerPHPwwwindex.php
20

F:ServerPHPwwwhead.html
4
複製程式碼
d. ./目錄/檔案和目錄/檔案的區別

這兩種寫法的效果基本是一樣的,不帶./的路徑受到include_path配置的影響

header 1 | header 2 | header 2
—|—
include_path | .;C:phppear | .;C:phppear

可以通過set_include_path()來設定包含檔案所在的目錄。

set_include_path(`f:wamp;`.get_include_path());
echo get_include_path(); //f:wamp;.;c:inc  包含多個目錄,從左向右查詢檔案
複製程式碼
include `main.html`; //包含的檔案在include_path設定的資料夾中查詢
複製程式碼
set_include_path(); //設定包含檔案的目錄
get_include_path(); //獲取包含檔案的目錄
複製程式碼

設定include_path的作用:

  • 將專案的經常使用的檔案放到一個統一的目錄下,然後通過include_path指向此資料夾,就不用寫很長的地址字串
  • 將安全性高的檔案放到站點外,通過include_path指向此目錄。比如連線資料庫檔案。
2.終止指令碼執行
a.exit()和die()

exit的die的別名,終止指令碼執行,終止後可以輸出一個字串。 die(`終止後輸出的字串`)

b.return

終止當前頁面的執行,不會終止包含頁面

3.return的作用
  • 終止函式執行
  • 從函式中返回值
  • 終止當前指令碼的執行
  • 用來做配置檔案
return array(
    `host` => `127.0.0.1`,
    `usename` => `root`,
    `passwrod` => `adminllj`,
    `port`=> `3306`
)
複製程式碼
4.延時指令碼執行

sleep(秒)

sleep(3);
echo `呵呵`;
複製程式碼
5.foreach陣列指標
  • 指標其實也是一個變數,用來儲存某個元素的地址。指標可以移動。
  • 預設情況下,開啟一個陣列,指標會指向陣列的第一個元素

foreach是迴圈,break和continue也適用於foreach迴圈

$stu = array(`a`,`b`,`c`,`d`,`e`,`f`);
foreach($stu as $key=>$val){
    if($key%2==0)
        continue;
    if($key==5)
        break;
    echo $key,`-`,$val,`<br>`;
}
//跳出%2 == 0  ==5終止
//1-b
//3-d
複製程式碼

foreach值變數支援傳地址(鍵變數不支援傳地址)
傳值:

$stu = array(`a`,`b`,`c`,`d`,`e`,`f`);
foreach($stu as $key=>$val){
    $val.=$val;
    echo $val,`<br>`;
}
var_dump($val);
// aa
// bb
// cc
// dd
// ee
// ff
// string(2) "ff"
複製程式碼
//foreach迴圈的是陣列的‘拷貝’
$stu = array(`a`,`b`,`c`,`d`,`e`,`f`);
foreach($stu as $key=>$val){
    $stu[] = `李白`;
}
var_dump($stu);
//array(12) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" [4]=> string(1) "e" [5]=> string(1) "f" [6]=> string(6) "李白" [7]=> string(6) "李白" [8]=> string(6) "李白" [9]=> string(6) "李白" [10]=> string(6) "李白" [11]=> string(6) "李白" }
複製程式碼
$stu = array(`a`,`b`,`c`);
foreach($stu as $key=>$val){
    $stu[$key] = `你好`.$val;
    $stu[]=`李白`;
}
print_r($stu);
//Array ( [0] => 你好a [1] => 你好b [2] => 你好c [3] => 李白 [4] => 李白 [5] => 李白 )
複製程式碼

傳址:

$stu = array(`a`,`b`,`c`,`d`,`e`,`f`);
foreach($stu as $key=>&$val){
    $val.=$val;
    echo $val,`<br>`;
}
var_dump($stu);
// aa
// bb
// cc
// dd
// ee
// ff
// array(6) { [0]=> string(2) "aa" [1]=> string(2) "bb" [2]=> string(2) "cc" [3]=> string(2) "dd" [4]=> string(2) "ee" [5]=> &string(2) "ff" }
複製程式碼
$stu = array(`a`,`b`,`c`,`d`,`e`,`f`);
foreach($stu as $key=>&$val){
    $stu[] = `李白`;
    echo $val,`<br>`;
}
//死迴圈
複製程式碼
6.陣列指標的操作
  • key():從關聯陣列中取得鍵名,沒有取到返回NULL。
  • current():返回陣列中的當前單元
  • next():將陣列中的內部指標向前(>)移動一位
  • prev():將陣列的內部指標倒(<)回一位
  • reset():將陣列的內部指標指向第一個單元
  • end():將陣列的內部指標指向最後一個單元

++如果一個陣列連續輸出兩次,必須要將指標復位。++

簡單示例

$stu = array(`a`,`b`,`c`);
echo key($stu),`-`,current($stu),`<br>`; //獲取當前鍵-返回當前值 //0-a
next($stu); //指標下移
echo key($stu),`-`,current($stu),`<br>`; //1-b
next($stu);
echo key($stu),`-`,current($stu),`<br>`; //2-c
next($stu);
//這裡到盡頭了
var_dump(key($stu)); //返回null
複製程式碼

迴圈指標

$stu = array(`a`,`b`,`c`);
while(key($stu)!==NULL){
    echo key($stu),`-`,current($stu),`<br>`;
    next($stu);
}
// 0-a
// 1-b
// 2-c
複製程式碼

倒序迴圈指標

$stu = array(`a`,`b`,`c`);
end($stu);//先把指標指向最後一個元素
while(key($stu)!==NULL){
    echo key($stu),`-`,current($stu),`<br>`;
    prev($stu);//指標倒回一位
}
// 2-c
// 1-b
// 0-a
複製程式碼
7.each()
  • 返回陣列中當前的鍵/值對並將陣列指標向前移動一步,
  • 如果內部指標穿越了陣列的末尾返回false。
  • 鍵值對被返回4個單元,其中包含索引陣列和關聯陣列,下標是key和0的是鍵,下標是1和value的是值。
  • each()=key()+current()+next()
  • 如果第二次再遍歷,必須通過reset()復位指標。

通過 while+each 遍歷陣列

$stu = array(`a`,`b`,`c`,`e`);
while($s = each($stu)){
    //echo $s[0],`-`,$s[1],`<br>`; 
    // 0-a
    // 1-b
    // 2-c
    // 3-e
    echo $s[`key`],`-`,$s[`value`],`<br>`; 
    // 0-a
    // 1-b
    // 2-c
    // 3-e
}
reset($stu); //復位
while($s = each($stu)){
    //echo $s[0],`-`,$s[1],`<br>`; 
    // 0-a
    // 1-b
    // 2-c
    // 3-e
    echo $s[`key`],`-`,$s[`value`],`<br>`; 
    // 0-a
    // 1-b
    // 2-c
    // 3-e
}
// 0-a
// 1-b
// 2-c
// 3-e
// 0-a
// 1-b
// 2-c
// 3-e
複製程式碼
8.list()

把索引陣列中的值賦給一些變數

流量:只能是索引陣列,不能是關聯陣列

$stu = array(`a`,`b`);
list($stu1,$stu2) = $stu;
echo $stu1,`<br>`; //a
echo $stu2,`<br>`; //b
複製程式碼

9.each()+while()+list()

$stu = array(`a`,`b`,`c`,`d`);
while($s=each($stu)){
    list($key,$value)=$s;
    echo $key,`-`,$value,`<br>`;
}
// 0-a
// 1-b
// 2-c
// 3-d
複製程式碼

10.陣列在複製指標的時候指標的處理

在陣列複製的時候,如果指標合法,指標是一起復制的。

$stu1 = array(`a`,`b`,`c`,`d`);
next($stu1);
next($stu1);
$stu2 = $stu1;
echo current($stu2),`<br>`; //c
echo current($stu1),`<br>`; //c
//說明陣列複製是把指標一起復制
複製程式碼

如果指標不合法,新陣列指標會被重新初始化。==新陣列就是先使用的陣列。==

$stu1 = array(`a`,`b`,`c`,`d`);
end($stu1);
next($stu1);
$stu2 = $stu1;
echo `stu2指標`.current($stu2),`<br>`; //stu2指標a
echo `stu1指標`.current($stu1),`<br>`; //stu2指標
複製程式碼

11.COW(寫時複製)

  • COW就是copy on write,在值傳遞的情況下,資料在賦值時候,內部存在一個優化,叫寫時複製。
  • 在值傳遞的賦值時,真實的資料空間不是立即複製的,++而是在其中一個變數執行寫操作的時候才會重新分配記憶體空間++。
echo `當前記憶體量:`.memory_get_usage(),`<br>`; //返回分配給PHP的記憶體量 124512
$array1 = range(0,100000);
echo `當前記憶體量:`.memory_get_usage(),`<br>`;  //990320
$array2 = $array1; //複製操作後記憶體沒有明顯變化
echo `當前記憶體量:`.memory_get_usage(),`<br>`;  //990376
$array1[0]=`a`; //寫操作後記憶體明顯變大
echo `當前記憶體量:`.memory_get_usage(),`<br>`;  //1536112 
複製程式碼
$stu=array(`tom`,`berry`,`ketty`,`rose`);
foreach($stu as $key=>$val) {
	$stu[4]=`李白`;
}
var_dump(current($stu));	//string(5) "berry"

//說明:foreach在第一迴圈時候,指標下移,指標指向berry,然後執行寫操作,此時分配記憶體,由於指標合法,所有連同指標一起復制。所以輸出berry.
複製程式碼

12.列印楊輝三角

 1<style type="text/css">
 2	span{
 3		width:45px;
 4		height:20px;
 5		display:inline-block;
 6	}
 7</style>
 8<?php
 9//列印楊輝三角
 10function yanhui($lines=10) {
 11	for($rows=1; $rows<=$lines; $rows++) {
 12		for($cols=1; $cols<=$rows; $cols++) {
 13			if($cols==1 || $cols==$rows)
 14				$num[$rows][$cols]=1;
 15			else {
 16				$num[$rows][$cols]=$num[$rows-1][$cols]+$num[$rows-1][$cols-1];
 17			}
 18			echo `<span>`.$num[$rows][$cols].`</span>`;
 19		}
 20		echo `<br>`;
 21	}
 22}
 23yanhui();
複製程式碼

相關文章