php变量与函数的特殊性

PHP语言是弱类型语言。也就是说php变量的类型是由值来动态决定的。

php变量名可以包括数字、字母、下划线,但数字不能打头。php变量前有一个"$"符号,表示为php的变量。

注意:变量名区分大小写。输出一个不存在变量,不报错,也无任何显示。

php变量的分类及其作用域、生命周期

局部变量——定义且使用在函数体内,作用域就是所在函数。即从声明它的那条语句开始到函数结束。
全局变量——定义在函数体外,作用域在整个php文件(包含了 include 和 require 引入的文件),但在函数体内不能读到,除非在函数内使用global关键字重新申明为global。
静态变量——用在函数内,被调用完后,内存不释放,保留最终值,static实际中多用来作统计累加。 静态变量也提供了一种处理递归函数的方法。递归函数是一种自己调用自己的函数。在其他语言中,如java,也存在static关键字,但是static在修饰字段时其意义是表示这个字段属于这个类,而不是属于类构造出来的对象;当static修饰方法,也可理解为这个方法属于这个类,可以用类名直接调用,且static还可修饰内部类。
超级全局变量 —— 超全局变量是在全部作用域中始终可用的内置变量。

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

这些超全局变量是:

详细参见http://www.php.net/manual/zh/language.variables.superglobals.php

超全局变量(表单变量)有三种书写风格。
(1)简短风格:在php.ini中设置register_globals设置为on,在表单传递过程中可直接用$接收,传递的值不安全,以后的php版本已经无法使用。
(2)中等风格:推荐使用在PHP 4.1以后的版本可以使用。用$_POST/GET[]数组接收,在接收页面中为超级全局。
(3)冗长风格:$HTTP_POST_VARS[],比较麻烦的一种风格,未来也会逐渐取消。
   

<?php
	function fun($a){
		$a=4;					//思考这个$a是局部的还是全局的
		echo "2:$a"."<br />";	//输出什么?
		global $a;				//通过global关键字声明后$a有什么变化?
		
		echo "$c"."<br />";		//输出一个不存在变量,不报错,输出为空也无任何显示。
		echo "3:$a"."<br />";
		
		$a = $a * $a;
		echo "4:$a"."<br />";
	}
	$a = 9;
	echo "1:$a"."<br />";	//程序由此开始
	
	$b = fun($a);			//调用函数时,程序跳转到函数定义的位置执行
	
	echo "5:$a";
	echo "$c";
	
/*
输出结果:
1:9
2:4

3:9
4:81
5:81

*/

?>




<?php
	function a (){
		$sum = 0;
		//static $sum = 0;
		echo "$sum"."<br />";
		$sum++;
	}
	for($i=0; $i<=3; $i++){
		a();
	}
	/*
	输出结果:
	0
	0
	0
	0
	本例如果使用static修饰这个变量,输出结果为:
	0
	1
	2
	3
	
	*/
?>



$a 将会在包含文件 b.inc 中生效。

<?php  
$a = 1;  
include "b.inc";  
?>  

Php代码
<?php  
//局部变量测试  
$s1= "out s1"; //全局变量   
 
function say(){  
    $s1 = "in s1"; //局部变量  
    echo "say():$s1";  
}  
say(); //输出局部变量: in s1  
echo "<br/>";  
echo "function out:$s1"; ////输出全局变量:out s1  
 
 
//static变量测试  
function count1(){  
    $num = 0;  
    $num++;  
    echo $num." ";  
}  
 
function count2(){  
    static $num = 0;  
    $num++;  
    echo $num." ";  
}  
 
for($i=0; $i<10; $i++){  
    count1(); //11 1 1 1 1 1 1 1 1 1   
}  
echo "<br/>";  
for($i=0; $i<10; $i++){  
    count2(); //1 2 3 4 5 6 7 8 9 10   
}  
 
 
echo "<br/>";  
 
//全局变量在函数中运用,加global  
 
$a="php";  
$b = "java";  
 
function show(){  
    echo $a; // 无输出  
    global $b;  
    echo $b; //定义global,输出java  
}  
show();  
?>  

输出3

<?php  
$a = 1;  
$b = 2;  
 
function Sum()  
{  
    global $a, $b;  
 
    $b = $a + $b;  
}  
 
Sum();  
echo $b; //3  
?>  

在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组

<?php  
$a = 1;  
$b = 2;  
 
function Sum()  
{  
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];  
}  
 
Sum();  
echo $b;  
?>  

静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数

 <?php
function Test()  
{  
    static $count = 0;  
 
    $count++;  
    echo $count; //12345678910   
    if ($count < 10) {  
        Test ();  
    }  
    //$count--;  
}  
Test();   
?>


C语言/Java等强类型语言,函数名字严格区分大小写,而php方法不区分大小写,也不支持函数重载,所以自定义函数不能和内置函数重名,不能再一个文件自定义同名函数。

  1. 所有的函数都使用关键词 "function()" 来开始
  2. 命名函数 - 函数的名称应该提示出它的功能。函数名称以字母或下划线开头。
  3. 添加 "{" - 开口的花括号之后的部分是函数的代码。
  4. 插入函数代码
  5. 添加一个 "}" - 函数通过关闭花括号来结束。

函数的参数

php函数的参数,函数 存在其他参数时,默认参数从右向左放置,即程序执行,从左向右匹配参数。

<?php

	function egg( $a ,$b = 4)
	//function egg( $a = 4 ,$b)
	{
		$c = $a + $b;
		return $c;
	}
	$c = egg(5);
	echo "$c"."<br />";
	/*程序执行结果为9.参数传递给$a,其中$b=4;$a=5;如果我们把参数放在左面:
	会有警告Warning: Missing argument 2 for egg(),但是依然输出结果5.原因是默认参数被覆盖,$b没有被赋值。建议在函数设计参数时,将默认参数置于后面。
	*/


?>

数值传值和引用传值

进行参数传递时,默认传递的是数值,而非变量地址的引用。即把变量参数的数值传入,传入函数后的变量在内存中有自己的空间。函数体内变量的改变,不会影响函数体外面的变量

可以通过加&符号来要求传入的是地址。即变量本身传入,传入后的变量与原变量建立联系,在内存中只有一个副本,公用一个存储空间,函数体内变量的变化,会影响到原变量的本身。

<?php
	
	function deliver($a){	//函数体$a为传值操作,不会影响函数体外的变量
	//可以通过加&符号来要求传入的是地址。
	//function deliver($a){
	//只在函数定义时使用引用符号,调用时不需要。这种方式已经不建议使用!!!
		$a += $a * 10;
		echo "$a"."<br />";
		
	}
	$a = 10;
	echo "$a"."<br />";
	deliver($a);
	echo "$a"."<br />";
	/*函数执行结果为
	10
	110
	10
	使用&$a的结果为
	10
	110
	110
	
	*/
	
?>

函数的嵌套

函数的递归嵌套:函数体中包含函数。

函数的嵌套应该注意执行的顺序。在程序中没有函数时,程序顺序执行。但存在函数时,函数被调用时才会执行。

<?php

	function first($QQ)
	{
		function second($jk)
		{
			$jk = $jk * $jk;
			return $jk;
		}
		return 100*second($QQ);
	
	}
	$num = 2;
	echo (first($num)."<br />");
	$num = 3;
	echo (second($num)."<br />");
	/*执行结果:
	400
	9
	如果我们没有执行调用外层函数first(),那么我们可以执行second()吗?
	答案是:不可以。会报错Fatal error: Call to undefined function second()。
	
	*/

?>

函数的递归

函数的递归:函数自己调用自己解决重复执行的问题。递归应该特别注意条件,防止进入死循环中

<?php
/*函数的递归*/
	function C($one ,$two ,$num ){
		if($num >0){
			$three = $one + $two;
			$one = $two;
			$two = $three;
			echo $three."--";
			C($one, $two, $num-1);
			//千万不要写成$num--,否则进入死循环,思考为什么???
		
		}
	
	}
	$a = 1;
	$b = 3;
	$c = 10;
	echo $a."--".$b."--";
	C($a,$b,$c);
	
/*
运行结果:
1--3--4--7--11--18--29--47--76--123--199--322-- 


*/
?>


相关文章推荐

php的超全局变量》,链接http://blog.sina.com.cn/s/blog_4c26abc501000ac5.html

各种语言下 static 详解 》,链接http://blog.csdn.net/freshlover/article/details/8562723


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值