函数:
定义方法:
function name(args){
statements;
return value;
}
函数可以没有返回值,视实际情况而定。
可以定义形参初始值:
function say_name($name,$age,$city='unknown'){
echo $name,$age,$city;
}
say_name('Jim',20); //结果:Jim20unknown
可以在函数定义位置之前调用函数而不必像c++一样需要声明。
可以通过function_exists()函数检测函数是否存在:
var_dump(function_exists(say_name));
变量的作用范围
函数体内定义的变量,作用范围在函数体内;在函数体外定义的变量对函数体内不影响。
$bbs = 'outer';
function say(){
$bbs = 'inner';
echo $bbs; //输出inner
}
say();
echo $bbs; //输出outer
可以在函数体内声明
全局变量:
$bbs = 'outer';
function say(){
global $bbs;
$bbs = 'inner';
echo $bbs; //输出inner
}
say();
echo $bbs; //输出inner
PHP中有许多内置的全局变量,可以通过$GLOBALS来查看:
echo "<pre>";
print_r($GLOBALS);
从结果中可以看到刚才定义的 global $bbs:
Array
(
[_GET] => Array
(
)
[_POST] => Array
(
)
[_COOKIE] => Array
(
)
[_FILES] => Array
(
)
[_ENV] => Array
(
)
[_REQUEST] => Array
(
)
[_SERVER] => Array
(
[HTTP_HOST] => localhost
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => max-age=0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36 CoolNovo/2.0.9.20
[HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
[HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8
[PATH] => D:\wamp\bin\mysql\mysql5.6.12\bin;D:\Python27\Lib\site-packages\sqlite3; <!-- 内容太多,省略掉了一些 -->
[SystemRoot] => C:\windows
[COMSPEC] => C:\windows\system32\cmd.exe
[PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
[WINDIR] => C:\windows
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache/2.4.4 (Win64) PHP/5.4.12
[SERVER_NAME] => localhost
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => D:/wamp/www
[REQUEST_SCHEME] => http
[CONTEXT_PREFIX] =>
[CONTEXT_DOCUMENT_ROOT] => D:/wamp/www
[SERVER_ADMIN] => admin@example.com
[SCRIPT_FILENAME] => D:/wamp/www/19.php
[REMOTE_PORT] => 8773
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /19.php
[SCRIPT_NAME] => /19.php
[PHP_SELF] => /19.php
[REQUEST_TIME_FLOAT] => 1395758669.242
[REQUEST_TIME] => 1395758669
)
[GLOBALS] => Array
*RECURSION*
[bbs] => inner
)
定义了全局变量,当然也可以移除它:
unset($bbs);
print_r($GLOBALS); //print_r用于输出数组
此时全局变量中自然没有$bbs了:
……
[REQUEST_TIME] => 1395759211
)
[GLOBALS] => Array
*RECURSION*
)
如果在函数体内声明了一个与函数外部变量同名的全局变量,并对其进行了修改,之后又卸载了它,那么外部的修改将得到保留:
$bbs = 'outer';
function say(){
global $bbs;
$bbs = 'inner';
unset($bbs);
$bbs = 'innerlater';
echo $bbs.'<br/>'; //输出innerlater
}
say();
echo $bbs; //输出inner
静态变量:
function add(){
static $i=1;
$i++;
echo $i.'<br/>';
}
add(); //2
add(); //3
add(); //4
add(); //5
第一次调用时进行初始值赋值,之后调用都不执行初始值操作。在函数多次调用时是共享的。
参数的传递:
按值传递:
function eat($name){
echo $name.'在吃饭<br/>';
}
$name = '小张';
eat($name); //小张在吃饭
按址传递:
function eat(&$name){
echo $name.'在吃饭<br/>';
$name = '小王';
}
$name = '小张';
eat($name); //小张在吃饭
echo $name; //小王
因为传入的是地址,因此可以在函数内修改函数外部的变量,即实参。
传递任意数量的参数:
func_get_args() 接收一个数组,包含所有参数;
func_num_args() 返回传递到当前函数的参数个数;
func_get_arg(整数) 取得指定位置的参数,序号从0开始。
function stu_name(){
//print_r(func_get_args());
$arr = func_get_args();
foreach($arr as $key=>$value){
echo "学生{$key}的名字是:".$value."<br/>";
}
echo "一共有".func_num_args()."名学生<br/>";
echo "---------------------------<br/>";
echo "第三个学生是".func_get_arg(2);
}
stu_name("张三","李四","王五","赵六","周七","李八");
结果:
学生0的名字是:张三
学生1的名字是:李四
学生2的名字是:王五
学生3的名字是:赵六
学生4的名字是:周七
学生5的名字是:李八
一共有6名学生
---------------------------
第三个学生是王五
变量函数:
可以在变量后加(),系统会查找与变量值同名的函数去执行。
$str = "show_date";
function show_date(){
echo date("Y-m-d")."<br/>";
}
show_date();
echo $str(); //系统会查找与$str值同名的函数然后执行,如果找不到则报错
结果:
2014-03-25
2014-03-25
递归调用:
在函数体内调用自身。必须加上一个停止调用的条件,否则会陷入死循环。
function jc($i){ //递归求阶乘
if($i>1){
$s = $i*jc($i-1);
}else{
$s = $i;
}
return $s;
}
echo jc(3); //结果:6
内部函数:
可以在函数体内定义函数。
以上均为个人理解,初学php,如果有不对的地方,欢迎大家指正!