【小白笔记】PHP学习之路 (7) --函数

函数:

定义方法:
	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,如果有不对的地方,欢迎大家指正! 微笑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值