php函数

  • 局部变量---动态变量
$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__,如果包含的文件中有这些输出,则会显示原本的文件名和文件行号,不是显示在引入文件中的行号和文件名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355