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