- 局部变量---动态变量
$i = 2;
$j = 4;
function test1()
{
echo $i;
echo $j;
}
test1(); // 此时会报错,因为局部变量,函数不能访问到外部的变量,由于函数执行完会释放变量,所以外部访问不到函数内的变量
- 局部变量---静态变量
function test2()
{
static $i = 1; // 如果不是静态变量的话,函数每次执行完就会释放内存,$i每次进来都会是1
echo $i . "<br>";
++$i;
}
test2();
test2();
test2();
test2();
- 全局变量---global
$m = 3;
$n = 5;
function test3()
{
global $m, $n;
echo $m, $n; // 原来不加global的话,这里是会报错的,加上global的话就是全局变量,所以函数内也能访问到外部的变量
}
test3();
- 全局变量---GLOBALS
function test4()
{
var_dump($GLOBALS); // 此时会打印当前所有定义的变量,变量名作为数组的键,变量的值作为数组的值
echo $GLOBALS['m']; // 此时这里会打印之前定义过的$m,值为3
}
test4();
PHP传值和传引用
- PHP传值
function test($m)
{
$m += 20;
var_dump($m);
}
$m = 5;
test($m); // 25
var_dump($m); // 5
- PHP传引用
function test(&$m)
{
$m += 20;
var_dump($m);
}
$m = 5;
test($m); // 25
test(3); // 当函数定义的是需要传引用,此时不能传值,需要传变量名
var_dump($m); // 5
- 可变函数
$funcName = "md5";
echo $funcName("KING"); // $funcName相当于是md5
echo "<br>";
echo md5("KING");
print_r(get_defined_functions()); // 能获得所有的函数
image.png
可变函数不可用于以上类似的语言结构
- 回调函数
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
function test1($var)
{
return $var *= 2;
}
$res = array_map('test1', $array);
var_dump($res); // 输出改变过后的数组
echo "<br>";
var_dump($array); // 输出还是之前的数组
echo "<hr>";
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
function test2(&$var)
{
$var *= 5;
return $var;
}
$res2 = array_walk($array, 'test2');
var_dump($res2); // 执行成功之后返回true,失败返回false,因为传的是引用,所以改变了数组
echo "<br>";
var_dump($array); // 输出改变后的数组
echo "<hr>";
$array = array(1, 2, 3, 4, 5, 6, 7);
function odd($var)
{
if ($var % 2 == 1) { // 如果除以2有余数,说明是奇数,输出
return $var;
}
}
$res = array_filter($array, 'odd');
var_dump($res); // 1,3,5,7
- call_user_func和call_user_func_array的使用
function study($username)
{
echo $username . " is studying...<br>";
}
function paly($username)
{
echo $username . " is playing...<br>";
}
call_user_func('study', 'admin');
call_user_func('paly', 'admin');
echo call_user_func('md5', 'lzq'); // 输出的是md5('lzq')的值
echo "<br>";
function add($x, $y)
{
return $x + $y;
}
function reduce($x, $y)
{
return $x - $y;
}
echo call_user_func('add', '1', '3'); //传多个参数的形式,也可以通过下面这种形式
echo "<br>";
echo call_user_func_array('reduce', array(2, 6)); // 输出-4
echo "<br>";
$array = array(1, 6);
echo call_user_func_array('add', $array); // 也行
- 匿名函数的使用
$func = function () {
echo "this is a func";
}; //简单的匿名函数
$func();
echo "<hr>";
$func = function ($username) {
echo "say hello to {$username}";
}; // 带参数的匿名函数
$func("lzq");
echo "<hr>";
// 通过create_function来创建匿名函数
$func = create_function('', 'echo "这是通过create_function创建的匿名函数";'); // 通过create_function创建基本的匿名函数
$func();
echo "<hr>";
$func = create_function('$x,$y', 'echo $x+$y;'); // 通过create_function创建带有参数的匿名函数
echo $func(1, 5);
echo "<hr>";
$func = call_user_func(function ($username) {
echo "say hello to {$username},这是通过call_user_func创建的带有参数的匿名函数";
}, 'lzq');
- 递归函数
function test($i)
{
echo $i . "<br>"; //3
--$i; //2
if ($i >= 0) {
$func = __FUNCTION__;
$func($i); //test(2)
/*
echo $i . "<br>"; //2
--$i; //1
if ($i >= 0) {
$func = __FUNCTION__;
$func($i); //test(1)
echo $i . "<br>"; //1
--$i; //0
if ($i >= 0) {
$func = __FUNCTION__;
$func($i); //test(0)
echo $i . "<br>"; //0
--$i; //-1
if ($i >= 0) {
$func = __FUNCTION__;
$func($i);
}
echo $i . "<br>"; //-1
}
echo $i . "<br>"; //0
}
echo $i . "<br>"; //1
*/
}
echo $i . "<br>"; //2
}
test(3);
/**
* 输出结果是3,2,1,0,-1,0,1,2
*/
- 自定义函数引入
require、require_once、include、include_once共四种方法
require "header.php"; // 可以多次包含引入,多次显示,如果文件不存在,使用require则会有一个警告和一个致命错误,程序不运行
require_once "header.php"; // require_once只会包涵一次,之后都不会再出现,require则会一直包含显示
echo "我是主体内容";
include('footer.php');
/*也可以多次包含引入,如果文件不存在,使用include则会有两个警告,程序不影响运行,include_once与require_once同等效果*/
例如一些FILE或者d__LINE__,如果包含的文件中有这些输出,则会显示原本的文件名和文件行号,不是显示在引入文件中的行号和文件名
网友评论