1.注意魔术常量被引入的问题
a.php中载入b.php【其中b.php中输出魔术常量__FILE__输出的是b.php的路径】
魔术常量被编译的顺序要在a中代码进行处理之前【可以理解为魔术常量在引入前的编译过程中就已经被预编译】
魔术常量相当于占位符【而不是一个引入文件中的变量】
【注意魔术常量的处理方式】
对文件载入过程的理解进一步【就是文件载入语句在文件中执行时,对被载入文件进行编译和复制(这样保证载入的问题的解决)】
【另外载入文件的作用域问题:载入文件的作用域取决于被载入的位置(例子就是在function中载入某文件,则该文件中变量作用域就处在
function中)】
【把魔术常量看做是一个特例即可】
2.call_user_func_array();//实现自定义函数和参数的传递
3.函数的递归调用!!!【重点】
函数体内再调用函数本身!!!
【递归本身并没有难点,function可以再任意情况下被调用,因为function本身就是一组执行代码的组合,可以被随意调用,只是外层
function一直没有正常return罢了,也就是说function的层结束需要return关键字来进行描述。】
function f1(){
f1();//这里就实现调用,只不过需要对条件进行判断
}
适合递归调用的场景:例如遍历目录这样的情况
调用的情况处理是一致的,就是有一个结束的条件出现【因为这样递归调用的话,能够节省定义函数的次数】
其实递归调用在实际使用情况是比较少用
【只是针对将一个复杂的事情分解,直到事件无法分解为止】
例子:通过递归实现斐波那契数列【后一项是前两项的和】
function f($n){
//首先对基本条件进行筛选
if ($n ==1 ){
return 1;
}elseif($n==2) {
return 1;
}
//开始使用公式进行递归
return f($n-1) + f($n-2);
}
f();//初始化调用
以上便实现了递归
递归的重点:
(1)递归点:什么时候发生递归
(2)递归的出口:什么时候递归结束
其实递归本身并没有任何难度,和直接调用function没有区别,就是调用需要使用的条件进行判断需要注意
【函数的调用本身也不需要太过多虑,就是简单的声明和调用的问题,正常理解即可】
4.迭代
通过迭代进行斐波那契数列的实现
function f($n){
$before_1=1;
$before_2=1;//初始化$n前两项值
//还需要对$n前两项的条件判断
//对前两项进行切换,一直迭代循环,便能一直得到
for($i=3;$i<=$n;$n++){
//迭代掉前两项的值,然后相加即可
}
}
通过迭代处理递归的要素能够很好的回避递归使用场景。
迭代的语法体系就是循环结构【这一点要注意:通过循环来实现递归这样的循环执行的效果】
【所以根本不冲突】
【而且使用迭代的话,效率更好】
迭代和递归都属于分治算法【将一个复杂的问题分开几个小问题,然后再处理】
5.处理函数的函数
function handling【手册中使用】
一些比较常见的处理函数使用
function_exists()【返回一个布尔值】
create_function()【返回一个函数名】【通过这个方法对已有的方法进行重组】
魔术常量__FUNCTION__【在函数内获得当前函数名(例如递归调用中动态调用自身)】
到目前为止创建函数的方法
function+函数名
function+匿名函数
creat_function创建一个比较灵活的函数
6.匿名函数
实现途径是通过closure对象来实现
USE语法【注意】