declare(strict_types=1);
//php5.5 或更早使用函数
function get_sum()
{
$arg_num = func_num_args();
$num = 0;
if ($arg_num == 0) {
return $num;
} else {
// var_dump(func_get_args() );
foreach (func_get_args() as $arg) {
// var_dump($arg);
$num += $arg;
}
return $num;
}
}
func_num_args(): 返回实参个数func_get_arg(索引): 返回某一个实参,必须是实参数组的索引,索引从0开始func_get_args():返回实参数组。func_num_args函数功能– 返回传递到函数的参数数目,其语法如下 : int func_num_args (void )。
function get_num2(...$args){
$sum=0;
if (!$args){
return $sum;
}else{
foreach ($args as $arg ){
$sum += $arg;
}
return $sum;
}
}
echo get_num2(3,4,5),"\n";
8.值传递和引用传递
值传递:单向传递,只能由实参传递给形参,而不能由形参传递给实参。内存中形参和实参存储在不同的空间,调用函数时,会给形参分配空间,实参将值传递给形参,调用函数完成后,形参释放空间,实参保留原来的值。
例子:值传递:形参$a,$b和实参$a1,$b1都开辟空间,$a和$b发生交换,但$a1和$b1空间不变化
function swap($a,$b){ $tmp=$a; $a=$b; $b=$tmp; } $a1=3; $b1=5; swap($a1,$b1); echo "a:".$a1."b:".$b1; //结果 a1=3,b1=5 引用传递:形参没有开辟空间,直接在$a1,$b1空间上进行交换 function swap(&$a,&$b){ $tmp=$a; $a=$b; $b=$tmp; } $a1=3; $b1=5; swap($a1,$b1); echo "a:".$a1."b:".$b1; // 值发生交换,a1=5,b1=3
局部变量:在某个范围内有效,超出范围则无效
$g_name = 'lxw';
function get_name()
{
//将变量全局化 方法一:
// global $g_name;
// echo $g_name;
//方法二:
echo $GLOBALS['g_name'], "\n";
}
get_name();
两种方法都输出:lxw
超全局变量:
$v1 = 1;
$v2 = 2;
function show_global()
{
// 将$v1超全局化,开辟空间,函数内部没有改变函数外部的值
// global $v1, $v2;
// $v1 =& $v2;
输出:1 2
//运用外部v1 v2本身的值
// 没使用&符号, 这样使用全局变量,并不是通过参数的形式来使用,而是直接在函数内部改变全局变量的值,所以不用&符号也行
$GLOBALS['v1'] =& $GLOBALS['v2'];
}
show_global();
echo $v1, "\n";
echo $v2 . "\n";
输出:2 2
静态变量(static):
function show_static()
{
static $x = 0;
echo $x++;
}
show_static();
show_static();
输出:0 1
10.可变函数: 灵活, 方便,多变
//可变函数
function get_apple($num){
return "in the get_apple(),we need".$num."boxs";
}
function get_orange($num){
return "in the get_orange(),we need".$num."boxs";
}
function get_fruit($fruit,$num){
$str="get_".$fruit;
return $str($num);
}
echo get_fruit('apple',5),"\n";
不使用可变函数
function get_fruit2($string,$numb){
if ($string=='apple'){
return get_apple($numb);
}elseif($string=='orange'){
return get_orange($numb);
}
}
echo get_fruit2('apple',4);
11.嵌套函数:
当in函数已经被存在时,在调用out函数就不能重复定义in函数
function out(){
if (!function_exists('in')){
function in(){
echo "out 函数先执行,in 函数才能执行,我是in函数\n";
}
}
}
out();
in();
out();// Cannot redeclare in() 加判断后不再报错
输出:out 函数先执行,in 函数才能执行,我是in函数
//多层嵌套
function f_out(){
echo 'out',"\n";
function f_mid(){
echo 'mid',"\n";
function f_in(){
echo 'in',"\n";
}
}
}
f_out();
f_mid();
f_in();
输出:
out
mid
in
嵌套函数传参数
function out($msg_str){
if (!function_exists('in')){
function in($msg){
// echo "out 函数先执行,in 函数才能执行,我是in函数\n";
echo "function in :".$msg."\n";
}
}
echo "function out :".$msg_str."\n";
in($msg_str);
}
out("Hello");
in('123');
输出:
function out :Hello
function in :Hello
function in :123
12.递归函数
function digui($i){
echo "当前参数为$i:{$i}\n";
$sum=1;
if($i==1){
echo "$i={$i},$sum={$sum}\n";
return 1;
}else{
$sum=$i*digui($i-1);
}
echo "$i={$i},$sum={$sum}\n";
return $sum;
}
echo digui(3);
输出:
当前参数为$i:3
当前参数为$i:2
当前参数为$i:1
$i=1,$sum=1
$i=2,$sum=2
$i=3,$sum=6
6
13.匿名函数(闭包)
方法一:
$msg = "lxw";
$bibao = function () use (&$msg) { //多一个&符号
echo "hello :" . $msg;
}; //必须加分号
$msg = "lxw22";
$bibao();
输出:lxw22
方法二:
$msg = "lxw";
$bibao = function () use ( $msg) {
echo "hello :" . $msg;
}; //必须加分号
$msg = "lxw22";
$bibao();
输出:lxw
方法三:
$msg = "lxw";
$bibao = function () use ( $msg) {
echo "hello :" . $msg;
}; //必须加分号
$msg = "lxw22";
$bibao();
输出:lxw
方法一:定义在use之后按照引用传递调用参数;
方法二和三比较说明: use使用的变量在定义闭包函数之前先声明好,而不是在调用的时候在声明;
闭包函数经典用法
function test_closure($name,Closure $clo){
echo "Hello",$name."\n";
$clo(); //注意加括号()
}
test_closure("Lily",function (){
echo "welocome";
});
输出:hello Lily,
welcome
14,代码复用性:
include_once与require_once:有且仅引用一次require与require_once: 引入不存在的文件时报致命性错误,后面的代码停止执行include与include_once: 引入不存在的文件时报j警告性错误,后面的代码继续执行
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112750.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...