函数预加载
PHP执行流程
语法分析-->语法分析-->编译--->加载编译的代码-->执行
代码在编译的过程中,函数就已经被加载进内存中了。
与函数有关魔术常量
__FUNCTION__ 获取当前函数名称
包含文件
在网站中有相同的banner,版权等等页面,我们可以将相同的页面做成包含文件,在展示的页面中包含即可。
包含文件相当于将文件的内容复制到页面中,如果包含文件有页面结构,(html),包含后,页面中就不止一个页面结构了,这与W3C定义的规范不符合。
语法:
include():可以包含多次
require():可以包含多次
include_once():只能包含一次
require_once():只能包含一次
包含文件中如果是html页面,在包含文件中有html代码,包含文件中的PHP代码是可以被解析的。
require 和include的区别:
相同点:可以包含多次
不同点:
include遇到错误继续执行
require遇到错误停止执行:
require_once or include_once() 只包含一次
项目中一般选择require(include),require_once()在包含之前需要先判断一下此文件是否被包含,如果没有则包含,否则不包含,在效率上显然没有require高。
包含文件相当于拷贝文件的代码复制到主文件中,魔术常量除外,魔术常量取得是魔术常量所在的文件的信息。
路径
../ 上一级目录
./ 当前目录
在html页面中 /表示根目录
./目录/文件 和 目录/文件的区别
这两种写法效果基本上是一致的,不带./的路劲受到include_path配置的影响
不带点的写法,默认在当前文件下找如果找不到就会去配置文件中 c:\php\includes目录下找,而带点的写法只会在当前目录下去找,找不到就直接抛错。
也可以set_include_path()来设置包含文件所在的目录
设置include_path:
1.将项目中经常使用的文件放在一个统一的目录下,然后通过include_path指向此文件夹,就不用写很长的地址字符串。
2.将安全性高的文件放到站点外,通过include_path指向此目录。比如连接数据库。
终止脚本执行
exit 和die() :这两者一样,一般情况下exit就直接终止了,die(str)在终止前还能在输出最后一条语句。
终止所有的执行。
return :终止当前页面的执行
return作用
1.终止函数的执行
2.从函数中返回值
3.终止当前脚本的执行
4.用来做配置文件
延迟脚本执行
语法:sleep(秒)
<?php
sleep(3);//延迟3秒
echo '无痕';
?>
foreach数组指针
1.指针其实也是一个变量,用来保存某个元素的地址。指针可以移动。
2.默认情况下,打开一个数组,指针会指向数组的第一个元素
foreach(数组 as 键=>值){
//循环体
}
执行流程
foreach是循环,也适用于continue和break;
foreache值变量传址
键变量不支持传地址。
默认传值
传址:
foreach循环遍历的时候,遍历的是数组的拷贝。
数组指针的操作
key():从关联数组中取得键名,没有取到返回NULL
current():返回数组中的当前单元
next():将数组中的内部指针向前移动一位
prev():将数组的内部指针倒回一位
reset():将数组的内部指针指向第一个单元
end():将数组的内部指针指向最后一位
数组从后往前输出
each()
返回数组中当前的键和值,并且将数组指针向前移动一步,如果内部指针穿越了数组的末尾,返回false,
键值对被返回了四个单元,其中包含索引数组和关联数组,下标是key和0的是键,下标是1和value的是值。
each=key()+current + next();
如果第二次遍历,需要通过reset()复位指针
list()
将索引数组中的值赋给一些变量
注意:只能是索引数组,不能是关联数组
<?php
$books = array(
'西游记','水浒传','红楼梦','西厢记'
);
list($book1,$book2) = $books;
echo $book1,'<br>',$book2; //西游记、水浒传
?>
数组在复制指针的时候指针的处理:
结论:在数组复制的时候,不管指针合法还是不合法,都是一起复制的。低版本的PHP语法中如果不合法,指针会被重新初始化,新数组指针会被初始化。新数组就是先使用的数组。
cow(写时复制)
cow就是copy on write ,在值传递的情况下,数据在赋值时候,内部存在一个优化,叫写时复制
在值传递的赋值时,真实的数据空间不是立即复制的,而是其中一个变量执行写操作的时候才会重新分配内存空间