函数是什么
暂且先记住这句话:
能够将一段代码封装成一个处理某个特定问题的代码块, , 通过调用的方式来执行, 从而简化代码编写的方法
函数结构分析
<?php
// 函数定义
function get_sum($a, $b) {
return $a + $b;
}
// 函数的调用
$sum = get_sum(2, 3);
echo $sum; // 5
?>
构成部分:
-
关键字: function
-
函数名: get_sum
命名规则: 有效的函数名以字母或下划线开头, 后面可以跟着字母, 数字或下划线
-
参数列表: ($a, $b)
-
函数体: { return $a + $b }
-
返回值: return $a + $b;
定义:
(a) 值通过使用可选的返回语句返回
(b) 可以返回数组和对象的任意类型
(c) 返回语句会立即终止函数的运行, 并且将控制权交回调用该函数的代码行
为什么要使用函数
例子: 从一组数据中找出最大的数
<?php
// 从第一组数据中找出最大的数
$arr1 = array(3, 99, 789, 34, 43, 435);
$max1 = $arr1[0]; // 先将数组的第一个数据设为最大值
foreach($arr1 as $v1) {
// 如果当前的 $max1 小于$v1
if ($max1 < $v1) {
$max1 = $v1;
}
}
echo $max1; // 789
echo '<br />';
// 从第二组数据中找出最大的数
$arr2 = array(34, 45, 5463, 2452, 32452);
$max2 = $arr2[0]; // 先将数组的第一个数据设为最大值
foreach($arr2 as $v2) {
// 如果当前的 $max2 小于$v2
if ($max2 < $v2) {
$max2 = $v2;
}
}
echo $max2; //32452
// 如果多组数据...
?>
上面的代码实现了对一组数据取最大值,
如果我们有很多组这样的数据要取最大值,
那么就要重复的编写上面代码, 但这样是很浪费的一种行为, 这时候我们就可以通过封装一个函数的方法, 通过调用函数的方式来简化我们的编码:
<?php
// 取最大值
function max_num($arr) {
$max = $arr[0]; // 先将数组的第一个数据设为最大值
foreach($arr as $v) {
// 如果当前的 $max1 小于$v1
if ($max < $v) {
$max = $v;
}
}
return $max;
}
// 从第一组数据中找出最大的数
$arr1 = array(35,34532,567,564,345);
$max_val1 = max_num($arr1);
echo $max_val1; // => 34532
echo '<br />';
// 从第二组数据中找出最大的数
$arr2 = array(7894, 45, 345, 45, 56, 5);
$max_val2 = max_num($arr2);
echo $max_val2; // => 7894
echo '<br />';
// ...
?>
函数特性介绍
<?php
function get_sum($a, $b) {
$result = $a + $b;
return $result;
}
// 函数的调用
$sum = get_sum(2, 3);
echo $sum;
?>
-
函数形参与实参
$a, $b 是函数的形参,
2 , 3 函数调用的实参, 实参可以是表达式, 变量等形参和实参的数目对应关系:
(a) 如果 实参数目 < 形参数目: 程序报错/警告
(b) 如果 实参数目 = 形参数目: 参数会一一对应
(c) 如果 实参数目 > 形参数目: 程序会正确执行, 形参的值会一一对应, 比如 get_sum(2, 3, 4, 5), 那么 $a = 2, $b=3
- 函数的默认值
func ($a, $b, $c, $d = 'default')
{
// ..
}
上面给了第四个变量设置的默认值, 如果传参的时候没有传第四个参数, 则第四个参数的值为 default
例子:
<?php
// 函数定义
function get_sum($a, $b, $c = 60) {
$result = $a + $b + $c;
return $result;
}
// 函数的调用
$sum = get_sum(2, 4);
echo $sum.'<br />'; // 结果: 2 + 4 + 60 = 66
$sum2 = get_sum(2, 4, 100);
echo $sum2; // 结果: 2 + 4 + 100 = 106
?>
- 函数强类型参数
定义: 为参数列表中的参数指定类型, 如果传入的数据类型不匹配, 将会抛出 TypeError 异常,
支持类型:
PHP 5.0.0: class/interface name
PHP 5.1.0: array
PHP 5.4.0: callable
PHP 7.0.0: bool, float, int, string
function get_sum(int $a, int $b) {
$result = $a + $b;
return $result;
}
- 函数可变参数列表
PHP 5.5及更早版本:
func_num_args(): 返回参数的总数量
func_get_arg(): 返回参数列表的某一项
func_get_args(): 返回一个包含函数参数列表的数组
<?php
function test() {
echo '参数总数: ', func_num_args().'<br />'; // 参数总数: 4
echo '第一个参数: ', func_get_arg(0).'<br />'; // 第一个参数: 1
echo '全部参数: '; // => 全部参数:
print_r(func_get_args()); // => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
}
test(1, 2, 3, 4);
?>
PHP 5.6+:
使用 ... 语法实现:
<?php
function test(...$args) {
echo $args[0].'<br />'; // => 1
echo count($args).'<br />'; // => 4
print_r($args); // => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
}
test(1, 2, 3, 4);
?>
- 函数值传递与引用传递
值传递: 不会改变原来实参的值
<?php
function test($num) {
$num = 5;
$result = $num + 1;
return $result;
}
$num = 4;
$res = test($num);
echo $res.'<br />'; // => 6
echo '$num: '.$num; // => $num: 4 ,$num 的值并没有被修改
?>
引用传递: 通过 & 来实现, 赋值给形参的是引用地址
<?php
function test(&$num) {
$num = 5;
$result = $num + 1;
return $result;
}
$num = 4;
$res = test($num);
echo $res.'<br />'; // => 6
echo '$num: '.$num; // => $num: 4 ,$num 的值也改变了
?>
- 函数变量作用域
局部变量:
- 当前页面中声明的普通变量, 不能在函数中或者类中起作用;
<?php
$a = 12;
function test() {
echo $a; // => 报错: Undefined variable: a
}
test();
?>
- 当前页面中声明的普通变量, 不能被传递到其他页面;
- 在函数中声明的普通变量, 在函数内部有效;
<?php
function test() {
$a = 12;
}
test();
echo $a; // => 报错: Undefined variable: a
?>
- 在类中声明的属性, 在类的内部有效;
全局变量 global
对于 PHP 而言, 可以这么说, 在页面中生成的变量都是全局变量, 在整个页面都是有效, 但是不能被函数或者类中的方法访问;
如果想被函数或者类中的方法访问, 我们就有了超全局变量:
$_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, $_REQUEST, $_SEESION
<?php
$a = 12;
$b = 24;
$c = 29;
function test() {
global $b;
echo $a; // => Undefined variable: a
echo $b.'<br />'; // => 24
echo $GLOBALS['c']; // => 29
}
test();
?>
global 和 GLOBELS 外部的全局变量的本身
静态变量 static
函数内部声明的变量, 函数执行完即销毁,
而通过 static 声明的静态变量. 函数执行完之后并未丢失
<?php
function test() {
$a = 1;
$a++;
echo $a;
}
test(); // => 2
echo '<br />';
test(); // => 2
// ...
?>
通过 static 标识的静态变量
<?php
function test() {
static $a = 1;
$a++;
echo $a;
}
test(); // => 2
echo '<br />';
test(); // => 3
echo '<br />';
test(); // => 4
?>
参考资料:
https://www.imooc.com/learn/827
http://www.php.cn/php-weizijiaocheng-390860.html
网友评论