函数:
函数定义形式:
function 函数名 (形参1,形参2,.... ){
}
函数参数:(2种)
形参:
1,形参一定是一个变量名!
2,该变量名只能是在该函数中有效的变量名;
3,而且只在该函数调用并执行时有效,函数结束,通常这些变量也就“销毁”。
实参:
实参就是一个“实际数据”,
该数据可以是一个“直接数据”(比如5,”abc”),也可以是一个变量中存储的数据。
实参的作用是将其数据“赋值给”形参变量。
实参跟形参之间通常应该有个“一一对应”关系:
定义形式: function 函数名(形参1,形参2,...... ){ 。。。。}
调用形式: 函数名(实参1,实参2,..... )
默认值参数:
注意:
默认值不能是对象或资源类型;
默认值只能是常量表达式,或常量,不能是变量
定义时可以不给定形参,但调用时,却又可以给定任何个数的实参。
在系统中,var_dump()这个函数也有同样的使用效果:
var_dump($v1);
var_dump($v1, $v2, $v3); //也可以
这种应用的实现,是依赖与系统中的3个系统函数来达到的:
func_get_args(); //获得一个函数所接收到的所有实参数据,并结果是一个数组
func_get_arg(n); //获得一个函数所接收到的第n个实参数据(n从0开始)
func_num_args(); //获得一个函数所接收到的所有实参数据的个数
定义函数:
function &函数名(形参1,形参2,.....) //注意函数名前有个引用符号“&”
{
$result = 0; //初始化
。。。。。。。
return $result; //此时返回数据,只能是变量
}
匿名函数:
表现1:
$f1 = function(){。。。函数体;};
//这里的匿名函数定义形式上没有名字,但其实又将之赋值给了变量$f1
使用时,就跟“可变函数”一样了:$v1 = $f1();
表现形式2:
调用其他函数2(匿名函数,实参1,实参2, ...... );
说明:
1此形式的匿名函数只有定义的函数体(无函数名)
2此形式的匿名函数只能作为其他函数调用时的参数(其他函数通常有特定用处)
3此匿名函数会在调用其他函数的“过程中”被执行。
能够使用(匿名)函数当作实参的函数,并不多!
其中有一个常见的是:call_user_func_array();
其使用形式为:
call_user_func_array(匿名函数,数组);
含义:
将数组的每一项当作该匿名函数的若干个实参,传递到该匿名函数中,并执行该匿名函数,并可以从该匿名函数中返回数据。
变量的作用域:(4个)
通常说作用域,有2个:
局部作用域:只能在所定义的函数范围内使用。
全局作用域:在函数的“外部”范围使用。
——php中,局部和全局作用域是不重叠的
——js中,全局作用域是包括局部作用域的
但还有两个:
超全局:就是在函数的内部和外部都可以使用。
超全局变量只有系统内部预定义的那几个,我们不能再程序中创建超全局变量。
静态局部作用域:其实也是局部,但多一个特征:数据能够在函数退出后仍然保持不丢失。
局部访问全局变量的特定语法:
在局部范围内,使用global关键字对全局变量进行一次“声明”,则就可以使用了:
语法:global $变量名;
实际上,函数中的global 语句,其实是创建了一个跟外部变量同名的局部变量,并通过“引用”的方式指向了外部变量的数据区
1 <?php 2 $v1=10; 3 function f3(){ 4 global $v1; 5 echo "<br />v1 = $v1"; 6 $v2=20; 7 } 8 f3(); 9 ?>
$GLOBALS:
在函数中(局部范围),使用$GLOBALS超全局数组来引用(使用)全局变量:
$GLOBALS超全局数组的作用是用于存储所有全局变量的数据:变量名为下标,变量值为对应元素值。
全局访问局部变量的特定语句:
通过引用传递的方式向形参传递一个引用实参变量
$v1 = 10;
function f1( &$p1, $p2){ ...... } //$p1是函数的形参,也即就是函数的内部(局部)变量
$v2 = f1( $v1, 10); //此时我们认为$v1就可以使用函数中$p1的值。
使用函数的引用返回形式:见前面引用传递的方式返回数据
函数中使用global关键字来首次引用一个全局变量,则函数结束后在全局范围就可以使用该变量了
有关函数的系统函数:
function_exists():判断某个函数是否被定义过,返回布尔值
if( function_exists(“ func1 “) == false ){
function func1(){。。。。。。};//定义函数
}
func_get_arg(n):获得一个函数的第n个实参值(n从0开始)
func_get_args():获得一个函数的所有实参,结果是一个数组
func_num_args():获得一个函数的所有实参的个数。
有关函数的编程思想:
递归思想的一个基本形式是:在一个函数中,有至少一条语句,又会去调用该函数自身。
递归思想(递归函数)
1,很多问题,用递归和递推都可以解决。
2,有些问题只能用递归。
3,如果两种方法都可以解决,推荐使用递推——效率高很多!
数组:
php中,数组的下标可以是整数,或字符串。
php中,数组的元素顺序不是由下标决定,而是由其“加入”的顺序决定。
多维数组的一般语法形式:
$v1 = 数组名[下标][下标][.....]
数组遍历:
foreach( $arr as [ $key => ] $value ) //$key可以称为键变量,$value可以称为值变量。
{
//这里就可以对$key 和 $value 进行所有可能的操作——因为他们就是一个变量
//$key 代表每次取得元素的下标,可能是数字,也可以能是字符串
//$value 代表每次取得元素的值,可能是各种类型。
//此循环结构会从数组的第一项一直遍历循环到最后一项,然后结束。
}
数组指针和遍历原理:
举例:$arr1 = array(2=>1, ‘dd’=>5, 1=>1.1, “abc”, 0=>true)
下标: |
2 |
‘dd’ |
1 |
3 |
0 |
值: |
1 |
5 |
1.1 |
‘abc’ |
true |
指针除了负责foreach循环的位置设定之外,还有其他一些函数也依赖于该指针:
1, $v1 = current( $arr1); //取得$arr1中当前指针所指向的元素的值,如果没有指向元素,则为false
2, $v1 = key($arr1); //取得$arr1中当前指针所指向的元素的下标,。。。。。false
3, $v1 = next($arr1 ); //将指针移向“下一个元素”,然后取得该下一个元素的值;
4, $v1 = prev($arr1); //将指针移向“上一个元素”,然后取得该上一个元素的值
5, $v1 = reset($arr1); //将指针移向“第一个元素”,然后取得该元素的值——数组指针初始化
6, $v1 = end($arr1); //将指针移向“最后一个元素”,然后取得该元素的值
7, $v1 = each($arr1); //取得当前元素的下标和值,然后移动指针到下一个位置。
for+next+reset遍历数组:
reset( $arr1 ); //重置数组,即:数组指针初始化,这里,返回的数据被“丢弃”了。
$len = count( $arr1);
for($i = 0; $i < $len $i++){
$key = key ($arr1 ); //下标
$value = current( $arr1 ); //值
//然后这里就可以对$key 和 $value进行任何作为变量的操作
next($arr1);//这里,移动指针到下一个元素(也同时丢弃了返回值)
}
while+each()+list()遍历数组:
each()函数解释:
each()函数可以取得一个数组中的一个元素的下标和值,然后再放入一个新的数组中,并且指针后移一位。
该新的数组,有4个元素,但存储的是下标和值的“双份”,类似下述形式:
array(
1 => 取出来的值,
‘value’ = >取出来的值,
0 = > 取出来的下标(键名),
‘key’ => 取出来的下标(键名)
);
list()函数解释:
使用形式:
list($v1, $v2, $v3,$v4 .... )= 数组$arr1;
其作用是:依次取得数组$arr1中下标为0,1,2,3, ....的元素的值,并一次性放入多个变量中(一一对应)
即其相当于如下语句:
$v1 = $arr1[0];
$v2 = $arr1[1];
$v3 = $arr1[2];
$v4 = $arr1[3];
..........
但是注意:只能实现这样的“从0开始的连续数字下标的元素的取值”(但并非要求数组的元素的顺序为同样的数字顺序)
foreach默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作(就是指前面的指针函数),则会复制数组后在复制的数组上继续遍历循环。
1 <?php 2 // $arrpao = array(8,10,26,15,30,13); 3 // $changdu = count($arrpao); 4 // echo "<br>排序之前"; 5 // var_dump($arrpao); 6 // for($i=0;$i<$changdu-1;++$i){ 7 // $max =$arrpao[0]; 8 // $xia =0; 9 // for($k=0;$k<$changdu-$i-1;++$k){ 10 // if($arrpao[$k]>$arrpao[$k+1]){ 11 // $a = $arrpao[$k]; 12 // $arrpao[$k]=$arrpao[$k+1]; 13 // $arrpao[$k+1]=$a; 14 // } 15 // } 16 // } 17 // echo "<br />排序之后:"; 18 // var_dump($arrpao); 19 ?>
文件加载
1.有4个文件加载的语法形式(注意,不是函数):
include , include_once , require , require_once;
1,如果加载文件失败,则有不同的处理规则;include和require不同
2,如果加载文件重复,则有不同的处理规则;XXX和XXX_once不同;
3,他们都是语法结构,而非函数,使用形式可以有两种:
3.1 include + ‘文件路径’; 或者 include + (‘文件路径’);
文件路径问题:(有3种)
1.相对路径
相对路径就是以“./”, 或“../”,开头的路径。
./ 表示当前网页文件的所在位置(文件夹,目录);
../ 表示当前网页文件的所在位置的上一级位置(文件夹,目录)
/ 表示根目录文件
这种相对位置对一个网站中的所有内容(包括php,html,图片,css,js文件)都有效。
2.绝对路径(2种)
1.本地绝对路径:
window系统: c:/d1/d2/page3.php
unix系列系统: /d1/d2/page3.php
2.网络绝对路径: http://www.abc.com/d1/d2/page4.php
3.只有文件名(无路径)
1.在php.ini配置文件中,有:include_path设定:
我们也可以在脚本中设定:
设置载入文件:set-include-path(‘文件路径’)
获取载入文件:get-include-path(‘文件路径’)
我们也可以使用另一个函数来获取当前的include_path的值:
2,上面没找到,在当前执行的网页文件所在目录(所谓当前工作目录)查找:
所谓当前网页文件,就是地址栏中显示的那个文件名。
3,上面还没找到,则在当前include命令所在文件的所在目录中查找:
如果一个文件(A)包含文件B,在文件B中又有include命令包含文件C,
此时B中的路径问题就可能发生这种情况。
文件载入执行过程
1.从include语句处退出php脚本模式(进入html代码模式)
2.载入include语句所设定的文件中的代码,并执行之(如同在当前文件中一样)
3.退出html模式重新进入php脚本模式,继续之后的代码
1 <?php 2 echo "<p>代码(1)</p>" 3 ?> 4 include ‘文件路径‘ 5 6 <?php 7 echo "<p>代码(1)</p>" 8 ?>
四种加载方法的区别:
1.include_once 和include的区别:前者能够保证不会被重复加载
2.require 和 include的区别:
如果被包含文件不存在,即引用失败(出错)时,include发出警告并继续执行后续代码,require直接终止。
require_once 和 require的区别:前者能够保证不会被重复加载。
return关键字
return的作用是:结束函数,并可以返回数据;
1 1.<?php 2 echo "<p>主文件中第一行</p>"; 3 4 include‘header2.php‘; 5 6 echo"<p>主文件中第2行</p>"; 7 ?> 8 9 10 2.<?php 11 echo "header2中第一行<br />"; 12 echo "header2中第2行<br />"; 13 return; 14 echo "header2中第3行<br />"; 15 ?>
结果:
return返回值的形式:
1.<?php echo "<p>主文件中第一行</p>"; $n = include ‘header2.php‘;//将加载文件执行的结果返回给$n echo "<p>主文件中第2行</p>"; echo "<p>主文件中 n =$n </p>"; ?> 2.<?php $m = 10; echo "header2中第一行<br />"; echo "header2中第2行<br />"; return $m; echo "header2中第3行<br />"; ?>
结果:
错误处理
语法错误:
程序没法运行,直接提示语法错误。
运行时错误:
只有程序运行到某行,或在某些特定的情形下运行才会发生的错误。
逻辑错误:
程序从头到尾运行都没有发生(并提示)错误,但程序运行计算的结果是错误的。
我们程序员主要面对的和要处理(应付)的错误,就是运行时错误。
系统错误:
E_ERROR:系统严重错误
一发生,程序立即停止执行。
该错误一般希望马上。
E_WARNING:系统警告
一发生,提示错误,并继续执行。
通常该错误希望能够在“下一工作日”去处理掉(解决)。
E_PARSE:语法错误
一发生,提示错误,而且代码完全不会运行——在运行之前先检查语法。
E_NOTICE:系统提示
一发生,提示错误,并继续执行。
发个邮件通知一下,自己安排时间有空去解决。
他们的本质是:
1 <?php 2 echo "<br />E_ERROR = ".E_ERROR; 3 echo "<br />E_WARNING = ".E_WARNING; 4 echo "<br />E_PARSE = ".E_PARSE; 5 echo "<br />E_NOTICE = ".E_NOTICE; 6 ?>
可见他们只是一个系统内部常量(整数常量);
用户自定义错误:(3个)
E_USER_ERROR;
E_USER_WARNING;
E_USER_NOTICE;
人工触发:
trigger_error(“错误提示” , 用户错误代号);
错误的显示控制:
设定是否显示:display_error:
php.ini中;display_error = On; //表示显示, Off表示不显示;