6.PHP包含文件、終止腳本、數組指針

1.包含文件

在網站中有相同的banner,版權等等頁面,咱們能夠將相同的頁面作成包含文件,在展現的頁面中包含便可。php

包含文件至關於將文件的內容複製到頁面中,若是包含文件有 頁面結構(),包含後,頁面中就不止一個頁面結構了。這與W3C定義的規範不符合,因此在包含文件中不能出現頁面的結構。css

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

//絕對路徑
<img src="c:\htdocs\img.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代碼是能夠被解析的++html

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:\ServerPHP\www\index.php
20

F:\ServerPHP\www\head.html
4
複製代碼
d. ./目錄/文件和目錄/文件的區別

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

header 1 | header 2 | header 2 ---|--- include_path | .;C:\php\pear | .;C:\php\pear安全

能夠經過set_include_path()來設置包含文件所在的目錄。bash

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();
複製代碼
相關文章
相關標籤/搜索