6.PHP包含文件、终止脚本、数组指针

566 阅读5分钟
1.包含文件

在网站中有相同的banner,版权等等页面,我们可以将相同的页面做成包含文件,在展示的页面中包含即可。

包含文件相当于将文件的内容复制到页面中,如果包含文件有 页面结构(),包含后,页面中就不止一个页面结构了。这与W3C定义的规范不符合,所以在包含文件中不能出现页面的结构。

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代码是可以被解析的++

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()来设置包含文件所在的目录。

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();