1.函数可以调用在前声明在后
1 <?php 2 ?????/*变量只可以调用先声明后调用*/ 3 ?????$var1="变量1"; 4 ?????$var2=array(1,2,3,4); 5 ?????echo $var1;print_r($var2); 6 ??7 ??8 ?????/*函数可以调用在前声明在后*/ 9 ?????test();10 ?????$var3=4;11 ?????$var4=null;12 ?????function test(){13 ?????????echo "test()执行";14 ?????}15 16 ?????/*静态变量也可以先调用后声明*/17 ?????echo test2::$sta;18 ?????class test2{19 ?????????static $sta="静态变量";20 ?????}21 ??>
PHP虽然是脚本语言,但也是需要先编译后执行的。
在编译过程中,函数,类等长度较大的代码块会被读入到堆内存中,程序的执行代码会被读入到代码段,静态数据被读入到初始化数据段。
程序执行时,计算机逐一从代码段取出代码按顺序执行,遇到声明变量的语句,则将变量存入栈内存。
所以,程序执行之初,函数、类、静态变量就已经在内存中放好了。而变量是执行到声明语句时才进入栈内存的,如果你提前调用,计算机根本不知道它是什么。
2.变量作用域与生命周期
1 <?php 2 ????$var1="全局变量1"; 3 ????$var2="全局变量2"; 4 ?5 ????define(‘TEST‘, ‘testdefine‘); 6 ?7 ????const TEST2=‘testconst‘; 8 ?9 ????function test($p){10 ????????global $var1;11 ????????echo $var1;12 ????????echo $GLOBALS[‘var2‘];//全局变量在函数内部无法直接调用,只可以用这两种方法13 14 ????????echo TEST;15 ????????echo TEST2; ???16 ????????echo test2::$st;//常量与静态变量无视作用域可以直接调用17 18 ????????$aaa;19 ????}20 ????test();//函数体内的局部变量$aaa和$p在函数执行完毕后就会销毁21 ???????????//即使以后还会调用该函数,也是重新声明新的变量,原来的变量找不回来22 23 ????class test2{24 ????????static $st="静态变量";25 ????}26 27 ????//全局变量,常量,静态变量的生命周期直到代码运行结束28 ?>
注:函数体内部不可以定义常量,会出现错误。
3.PHP为变量指定数据类型
1 <?php 2 ????int $a;//为变量指定数据类型 3 ?4 ????/*为函数的返回值和参数指定数据类型*/ 5 ???????int function test(int $i) 6 ???????{ 7 ???????????????return $i+1; 8 ???????} 9 10 ???????/*在这里就和强类型语言一样,如果传递的值不符合指定的数据类型会出错*/11 ???????/*不同的是PHP中不允许函数重载*/12 ?>
4.值传递与引用传递
1 <?php 2 ????/*数组赋值是值传递*/ 3 ????$a=array(1,3,2); 4 ????$b=$a; 5 ?6 ????sort($a); 7 ?8 ????var_dump($a);//$a=arrar(1,2,3) 9 ????var_dump($b);//$b=array(1,3,2)10 11 ????/********************************/12 13 ????/*对象赋值是引用传递*/14 ????class test{};15 ????$a=new test;16 ????$a->name="hello";17 18 ????$b=$a;19 20 ????var_dump($a);//$a=test{name=‘hello‘}21 ????var_dump($b);//$b=test{name=‘hello‘}22 23 ????$a->name="nihao";24 25 ????var_dump($a);//$a=test{name=‘nihao‘}26 ????var_dump($b);//$a=test{name=‘nihao‘}27 ????28 ????/************************************/29 30 ????/*引用最为函数的参数*/31 ????function increment(& $i)32 ????{33 ????????$i++;34 ????}35 ????$a=1;36 37 ????increment($a);38 ????echo $a;39 ?>
5.可变参数的函数
1 <?php 2 ????function test() 3 ????{ 4 ????????$args=func_get_args();//将参数作为数组返回 5 ????????for ($i=0; $i < count($args); $i++) { //打印出每一个参数 6 ????????????echo $args[$i].‘<br>‘; 7 ????????} 8 ????} 9 ????test(1,‘hell0‘,‘three‘,4,9);10 ?>
6变量函数
1 <?php 2 ????/*可以将函数名的字符串赋值给一个变量,然后通过变量名()的方式调用函数*/ 3 ????function testfunc() 4 ????{ 5 ????????echo "this is atest"; 6 ????} 7 ?8 ????$a="testfunc"; 9 10 ????$a();//输出this is atest11 ?>
7.回调函数
回调函数的本质就是作为参数被另一个函数调用的函数。
函数是一段执行特定行为的代码,我们可以将变量传递给函数的参数改变函数的行为特征。
但是参数仅仅是变量改变的行为是有限的,有时甚至需要传入一个函数作为参数,这就是回调函数。
1 <?php 2 ????/*通过变量函数的方式传入回调函数 ???*/ 3 ????/*打印出1到$num的所有数字*/ 4 ????/*同时过滤掉满足fun的数字不打印*/ 5 ????function filter($num,$fun) 6 ????{ 7 ????????for ($i=1; $i <= $num ; $i++) { 8 ????????????if($fun($i)) continue; ?9 ????????????echo $i."---";10 ????????}11 ????}12 13 ????function f3($i)14 ????{15 ????????if($i%3==0) return true;16 ????????else return false;17 ????}18 19 ????filter(100,‘f3‘);//将函数名作为字符串传入20 ?>
8.call_user_func_array
1 <?php 2 ????/*打印出所有参数,有多少打印多少*/ 3 ????function listargs() 4 ????{ 5 ????????$args=func_get_args(); 6 ????????for ($i=0; $i < count($args); $i++) { ?7 ????????????echo $args[$i];echo "<br>"; 8 ????????} 9 ????}10 11 ????/*假设现在要打印出所有GET方式传过来的值,但是值的数量我们并不知道*/12 ????/*listargs($a1,$a2,...)这样的方式就用不了了,而我又不希望改写listargs的代码该怎么办呢*/13 14 ????call_user_func_array(‘listargs‘, $_GET);//第一个参数为函数名的字符串,第二个参数是数组,该函数的参数15 ????16 ?>
1 <?php 2 ????class Test{ 3 ????????public function test1($a,$b) 4 ????????{ 5 ????????????echo $a."-".$b; 6 ????????} 7 ?8 ????????static function test2($a,$b) 9 ????????{10 ????????????echo $a."+".$b;11 ????????}12 ????}13 14 ????//call_user_func_array(array(‘Test‘,‘test2‘),array(3,5));//调用类的静态函数15 ????call_user_func_array(array(new Test,‘test1‘),array(3,5));//调用类的普通成员函数16 ?>
用call_user_func_array()实现回调函数
1 ?<?php 2 ?????/*通过call_user_func_array()的方式传入回调函数 ???*/ 3 ?????/*打印出1到$num的所有数字*/ 4 ?????/*同时过滤掉满足fun的数字不打印*/ 5 ?????function filter($num,$fun) 6 ?????{ 7 ?????????for ($i=1; $i <= $num ; $i++) { 8 ?????????????//if($fun($i)) continue; 9 ??????????????call_user_func_array($fun, array($i));10 ?????????????echo $i."---";11 ?????????}12 ?????}13 ?14 ?????function f3($i)15 ?????{16 ?????????if($i%3==0) return true;17 ?????????else return false;18 ?????}19 ?20 ?????filter(100,‘f3‘);//将函数名作为字符串传入21 ??>
PHP-函数小记
原文地址:https://www.cnblogs.com/patermenkey/p/8313582.html