函数定义 & 调用
- 普通函数
- 可变函数
- 箭头函数
php
<?php
// function 函数名(参数列表[可选]) {
// 函数体
// 返回值[可选]
// }
function sayHi($name) {
echo "Hi {$name}";
}
sayHi("tom"); // Hi tom
// 匿名函数(或者叫闭包): 在 PHP 的手册教程中的中文翻译称之为: "可变函数"
// https://www.php.net/manual/zh/functions.variable-functions.php
$sayHello = function($name) {
echo "Hello {$name}";
}; // 注意了赋值语句行尾必须加上 ;
$sayHello("jerry"); // hello jerry
// 注意点:
// 0. 定义箭头函数需要用关键字 fn(参数) => 返回值
// 1. 箭头函数只能写一行(类似 Python 的 lambda 表达式)
// 2. 箭头函数的作用域永远是父级作用域(类似 JS 箭头函数的 this 指向)
$n = 1;
$increment = fn($step) => $n + $step;
$x = $increment(5);
var_dump($x); // int(6)箭头函数是 php 7.4 的新语法,
判断是否可调用
其实也就是判断: 是否是一个函数(只有函数才可以调用呀)
php
<?php
function f1() {}
$f2 = function() {};
// 注意是传入函数名字符串, 而不是直接将函数传入
var_dump(is_callable('f1')); // bool(true)
var_dump(is_callable($f2)); // bool(true) 注意: 匿名函数需要直接传入变量
var_dump(is_callable('$f2')); // bool(false) 否则无法检测出来会返回 false
var_dump(is_callable('f2')); // bool(false) 否则无法检测出来会返回 false
var_dump(is_callable('f3')); // bool(false) 检测不存在的函数, 不会报错, 会返回 false魔法常量 __FUNCTION__
__FUNCTION__ 在哪个函数中使用, 它的值就是那个函数的函数名
php
<?php
function sayHi($name) {
echo __FUNCTION__ . " hello {$name}";
}
sayHi("tom"); // sayHi hello tom
echo "<hr />";
$sayHello = function($name) {
echo __FUNCTION__ . " hello {$name}";
};
$sayHello("jerry"); // {closure} hello jerry函数的参数
php
<?php
function sum($n1, $n2, $n3) {
return $n + $n2 + $n3;
}php
<?php
function sayHi($name = "tom") {
echo "Hi {$name}";
}php
<?php
echo "<pre>";
// 值传递
function pop_last($arr) {
return array_pop($arr);
// array_pop 函数的作用就是: 将数组的最后一个元素弹出,
// 和 JS Array.prototyp.pop() 方法功能一模一样
}
$arr1 = ['a', 'b', 'c'];
$res1 = pop_last($arr1);
var_dump($arr1); // 原数组不变 ['a', 'b', 'c']
var_dump($res1); // c
echo "<hr />";
// 引用传递(指针传递/内存地址传递)
// 在C语言中, 指针是一种数据类型, 它指向一个
// 内存地址, 而且 & 符号就是取内存地址的意思
function pop_last2(&$arr) {
return array_pop($arr);
}
$arr2 = ['a', 'b', 'c'];
$res2 = pop_last2($arr2);
var_dump($arr2); // 原数组被修改 ['a', 'b']
var_dump($res2); // c
echo "</pre>";函数返回值
- 只能返回一个值
- 默认返回
NULL
php
<?php
function f1() {
// echo 是输出到缓冲区,可不是函数返回值
echo "hello<br/>";
}
function f2() {
// return 关键字才是结束函数并返回数据的
return "hello";
}
$res1 = f1();
var_dump($res1); // NULL
$res2 = f2();
var_dump($res2); // string(5) hello作用域
超全局作用域
在任意PHP文件中都能够访问的变量/常量, 只有内置的变量/常量能做到这一点
php
<?php
// a.php
var_dump($_SERVER);
>
<?php
// b.php
var_dump($_SERVER);
?>全局作用域
在变量定义所在文件中, 整个文件有效
php
<?php
$num = 10;
function f1() {
// 默认情况下: 在函数内部无法访问
// global 关键字的作用:
// 1. 如果全局作用域有 $num 就将使用全局作用域的 $num
// 2. 如果全局作用域没有 $num, 则会在全局作用域创建一个 $num
global $num;
var_dump($num);
}
f1();
$f2 = function() use($num) {
// 默认情况下: 在函数内部无法访问
// 可以使用 use 关键字告诉解释器, 我要访问全局变量
// 但是: use 只能用作匿名函数, 不能用于 function 定义的函数
// 这样写是不行的: function f1() use($num) { }
var_dump($num);
};
$f2();函数作用域
仅在函数体中有效
php
<?php
function f1() {
$num = 10;
}
// 这样是不行的, 无法访问函数内部的变量
// var_dump($num);
function f2() {
global $num;
$num = 10;
}
// 这样是不行的, 无法访问函数外部的变量
// var_dump($num);
// 这样是可以的:
// 因为 f2 一旦执行:
// 1. $num 就会被标记为全局变量
// 2. $num(全局变量) 被赋值为 10
f2();
var_dump($num); // int(10) => 3. 所以这里会输出 int(10)
function f3() {
$num = 10;
global $num;
echo "f3 num: $num";
}
f3();
var_dump($num); // NULL 请问: 为什么会输出 NULL?
/*
为什么会输出 NULL?
1. f3函数执行:
1.1) $num = 10; 是局部变量赋值为10, 在函数内部的变量(是函数作用域)
1.2) global $num; 看全局是否有 $num 变量, 没有, 则创建一个全局变量 $num, 但是后续并没有给这个全局变量赋值
1.3) echo "f3 num: $num"; 执行, 输出字符串, 注意: 此时的 $num 是局部变量, 所以值是 10
2. 执行 var_dump($num); 由于创建了全局变量 $num, 但是并没有赋值, 所以输出 NULL
*/