1.求最大公约数
辗转相除求值
例如:12,8求最大公约数
12%8=4[不为零]
8%4=0[为零,则4为最大公约数]
【原理就是12,8的最大公约数和8,4的最大公约数一致】【这个问题已经可被证明】
计算机中最早的算法
2.文件载入---流程
【php执行的先后顺序】【php对代码的编译以文件为单位】
先检查一个文件中的语法
再进行编译
然后才会一行行解释执行
【这一点需要注意】
这里进行文件载入的流程讲解:
php文件载入时,被引入的文件中的语法并不会解析,只有当该文件被执行【也就是被引入语句之后的部分才会报错】
也就是说,载入文件部位前面的解析不被载入文件的语法所影响。只会到执行到include这样的语句时,才会对文件进行语法检查
【其实也就是一个包含include的文件中的语法检查并不会在执行前对被包含的文件的语法进行检查】
当载入一个文件时,先退出当前的php模式,然后将载入的文件代码载入,然后再执行,再进入php模式。
【这样一个过程保证了php载入过程时,可以载入任何情况的文件:php和HTML等,因为php本身就是嵌入式编程文件,所以嵌入各种文件并不受影响】
【而也就是载入文件相当于将文件代码复制到载入文件的指定位置,所以关于文件载入的路径是相对于文件执行的位置的原因】
【最后include和require的区别】
include只会触发一个警告
require会触发一个致命错误【脚本停止运行】
include_once:只载入一次【有一个该文件是否被加载的判断机制存在,效果更好】
在实际编程中,常用的还是require【效率高(相比较带once而言),并且会即时报错】
以上就是文件载入的所有问题。【先不考虑载入文件中的header】
【在项目中,我们会将载入文件的方法都写在同一个文件中】
文件载入中的return的功能【模块化之后,模块文件作为数据容器之后,使用return将获得的数据返回给载入文件中】
【这也是框架中最常用的关键字,但是这里的return不是函数中处理函数返回值的关键字,而是文件中直接retuen数据,会终止被包含脚本的执行】
载入文件总结:
载入文件的内容是一些定义的方法时,那么载入之后就会保证代码的执行,但是载入的内容包括数据时,被包含的数据并不是直接拿来显示和使用。【看一下数据库config包含文件的情况】
载入文件的path问题【set_include_path对搜索路径的设置】
载入文件的原理【相当于代码的复制和执行,但是为何载入都是数据的文件会有问题?
经过测试,可以正常包含并且使用被包含的数据,这里包含数据文件使用return的目的应该是为了使获取包含文件返回值直接进行赋值到某变量,而不是轻率的使用原本文件中的变量名,因为变量名有可能会出现冲突和重写
载入文件的机制就是将代码复制到载入位置,只是知道执行到载入位置才会被包含文件中代码进行语法检测
】
以上便是载入文件的内容,重点对原理和path进行理解
3.控制脚本执行
die
exit
exit用于调试脚本
die用于错误抛出
sleep相当于脚本的延时效果
4.函数的使用
函数的使用本身就是为了代码重用,因为函数的调用可以多次使用
与大多数API函数一样,都是用于代码重用,和调用的灵活性
【php和js的一些比较相近的观念】
函数的使用就是模块化的开始
php中对function关键字的代码优先编译【php中,可以先调用后定义函数,但是该调用只能在一个文件内】
【因为require语句并不会优先被编译】
php也注意这个提前的规则
函数分为几部分
(1)【函数名的两个特例:可变函数和匿名函数】
【可变函数】
php中函数调用也可以使用变量实现调用【函数的调用可以由一个变量来充当】
【php函数调用就是一个字符串实现,php可以使用变量来实现标示符是理所当然的。而函数调用本身就是一个标示符调用】
function hello(){
echo 'hello';
}
$hello = 'hello';
$hello();//实现变量调用函数
使用变量来调用函数,优点就是能够动态实现函数调用的效果【工厂方法实现调用函数,根据不同条件调用不同的函数】
【匿名函数】
函数用于直接调用的情形
$say = function(){};
这才是匿名函数的使用场景
【php中的匿名函数是通过closure(闭包)对象实现的。php中的闭包函数就是匿名函数】
【php中作用域概念对闭包没有太多的要求】
【php就是通过对象来实现匿名函数进行管理】
(2)【函数的参数:形参和实参】
形参和实参的关键就是一个赋值的问题【也就是值传递和引用传递】
值传递相当于实参赋值一份值给形参
引用传递相当于实参将自己的引用传递给形参
【需要进一步研究赋值中的引用问题】
【引用传值的途径就相当于给变量加了一个别名,当改动这个别名时,该变量值也同样改变。这也是为什么修改数组中数据时,使用引用传值时更加高效,而值传递的变量改动并不会改动原本的数据】【只是引用传递的unset情况只是将引用处理掉,并不会直接被垃圾回收掉。这也是php自身的垃圾回收机制】
【值传递就是单纯复制了一份而已】
以上【引用传值问题已经解决】
【参数的默认值,形参指定默认值】【使用默认值的形参放在参数中的后面,为了调用时方便。如果放在前面,默认值本身没有意义,因为必须在调用时保证实参值存在】
【参数的个数,形参和实参要进行对应(实参可以数量多,形参数量多的话,需要将多余的形参转化为默认值)】
针对参数数量的问题,有一种情形【不定参数函数】
function hello(){
//形参一个都不定义
func_get_args();//通过php默认的这个方法来获得传入的参数
}
hello(1,2,3...);
以上这种情况就是不定参数函数
(3)【函数体】
函数是一个可执行代码的集合。
函数体的关键就是返回值
return
【注意:引用返回】
function &f1(){
//这种定义函数的情况表示,这个函数可以返回引用,但不是一定返回
return
}
$result
5.变量作用域和生命周期
变量作用域的不同带来了全局变量和局部变量的区别。另外系统定义的变量由超全局变量【$_GET之类】
【关键】
php中的作用域都不能互相访问【php作用域不可重叠。和js相区别】
【一定要区别php的全局变量的访问权。而js中因为作用域链使得全局变量实现超全局的作用】
<?php
$a= 'hello';
function f1(){
echo $a;
}
f1();
?>
会报notice【Notice: Undefined variable: a in D:wampwww estalt est3.php on line 4】
这样的话,要想实现全局与局部交互的功能,只能通过参数传递实现
【或者使用超全局变量$GLOBALS(这样就实现了全局和局部一起访问,交互)】
【php机制中,global与全局变量名一一对应。本身就对应,甚至不是引用】
好长时间没写php的function都忘记局部变量的问题
<?php
$_GET['a']='hello';
function f1(){
echo $_GET['a'];
}
f1();
?>
//global超全局的问题
<?php
$a='hello';
function f1(){
echo $GLOBALS['a'];
}
f1();
?>
//global关键字的使用
<?php
$a='hello';
function f1(){
global $a;//相当于查找名叫$a的全局变量,然后创建一个到全局$a的一个引用【只有这种情况下是一个引用】
echo $a;
}
f1();
?>
这样便能实现交互【其实在现实编程中很少使用这样的情况。php本身很少做计数的功能,计数基本都在循环中完成或者借助数据库】
【但是递归上来说有问题:递归调用需要的就是传入的参数是可变的,来实现对递归内的控制】
【变量的生命周期】
php中任何的数据资源(变量、常量等),最大的生命周期就是脚本周期结束的时候。【这就是为什么文件写入数组中,但是重新开启之后,数组并不会改变的原因】
局部的生命周期【从function中函数体执行完成之后,便销毁】【通过多次调用同一个函数输出同一个变量,看结果便能得到结论】
【静态局部变量:在函数运行结束后,值不被释放,而是被保留,在下次调用时,记录】
使用关键字static
function f1(){
static $v =1;//这里的1的赋值只有第一次调用函数时使用(这里也对单例是一个启发)
//只有当$v第一次声明时执行$v=1;这个表达式
$v++;
echo $v;
}
f1();//2
f1();//3
到现在将变量的细节有一个更加清晰【static的好处就相当于缓存一个数据】
【重点】
有了静态局部变量之后,便能实现引用返回的效果
function & f2(){
static $result = 0;
$result += 10;
return $result;
}
$value = & f2();//保证了引用返回的调用,使得返回值result和$value为同一个引用。而result本身又是一个静态局部变量,所以保留了上一步运算剩下的结果
echo $value;
$value +=10;
echo '<br>',$value;
$value1 = f2();
var_dump($value1);//30
引用返回的这个操作能够使局部内的方法对全局的变量有一个最完备的操作和记录的能力