func_num_args( )可以用来结合func_get_arg( )和func_get_args( )来允许使用者定义的函式接受variable-length参数列表。其中,func_get_arg( )从参数列表返回项目,其语法:int func_get_arg (int arg_num),传回定义函数的参数列表的第arg_num个参数,其参数从0开始。且函数定义的外面来呼叫此函数会产生警告;并且当arg_num大于函数实际传递的参数数目时亦会产生警告并返回FALSE。
func_get_args()函数和func_get_arg()函数的区别在于,func_get_args()函数传回一数组,数组的各个元素相当于是目前使用者定义函式的参数列的数目。
.png)
值传递:单向传递,只能由实参传递给形参,而不能由形参传递给实参。内存中形参和实参存储在不同的空间,调用函数时,会给形参分配空间,实参将值传递给形参,调用函数完成后,形参释放空间,实参保留原来的值。
例子:值传递:形参$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
9.变量作用域
局部变量:在某个范围内有效,超出范围则无效
1>在当前页面中声明的普通变量,不能在函数或者类中起作用;
2>在当前页面中声明的普通变量,不能被传递到其他页面;
3>在函数中声明的普通变量,在函数内部有效;
4>在类中声明的属性,在类的内部有效;
全局变量(global):
$GLOBALS 全局变量数组
对于php而言,可以这么说,在页面中生成的变量都是全局变量,在整个页面都有效;但是不能被函数或者类中的方法访问。
$g_name = 'lxw';
function get_name()
{
//将变量全局化 方法一:
// global $g_name;
// echo $g_name;
//方法二:
echo $GLOBALS['g_name'], "\n";
}
get_name();
两种方法都输出:lxw
超全局变量:
如果想被函数或类中方法访问,我们就有了超全局变量。
注意:在函数或类中,超全局变量是不能作为可变变量的
PHP自定义的超全局变量:8个
$_GET和$_POST, $_COOKIE和$_SESSION,$_SERVER,$_FILES,$_ENV,$_REQUEST
$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):
仅仅在函数局部作用域中存在,函数执行完,值并没有丢失
给static赋值时不能是函数表达式;
function show_static()
{
static $x = 0;
echo $x++;
}
show_static();
show_static();
输出:0 1
10.可变函数: 灵活, 方便,多变
定义:变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它
//可变函数
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.嵌套函数:
特点:PHP嵌套函数有一些特别之处,最特别的是,当外部函数被调用时,内部函数就会自动进入全局域中,成为新的定义函数。
单层嵌套&&多层嵌套
当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.匿名函数(闭包)
定义:匿名函数(anonymous functions),又叫闭包函数(closures),允许临时创建一个没有指定名称的函数,最经常用作回调函数(callback)参数的值。
使用:闭包函数可以作为变量的值来使用。
方法一:
$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与require
include_once与require_once:有且仅引用一次
require与require_once: 引入不存在的文件时报致命性错误,后面的代码停止执行
include与include_once: 引入不存在的文件时报j警告性错误,后面的代码继续执行
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- JavaScript 函数基础
1. JavaScript 函数基础 1. 定义方法 2. 函数的调用方法 3. 函数方法 apply : 将函数作为数组的方法来调用 将参数以数组形式传递给该方法 call : 将函数作为对象的 ...
- Python 函数基础、有序集合、文件操作(三)
一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...
- 【2017-03-05】函数基础、函数四种结构、ref和out参数、递归
一.函数基础 1.函数/方法:非常抽象独立完成某项功能的一个个体 2.函数的作用: 提高代码的重用性提高功能开发的效率提高程序代码的可维护性 3.分类 固定功能函数高度抽象函数 4.函数四要素:输入, ...
- PHP基础入门(三)---PHP函数基础
PHP基础入门(三)---函数 今天来给大家分享一下PHP的函数基础.有了前两章的了解,想必大家对PHP有了一定的基础了解.想回顾前两章的朋友可以点击"PHP基础入门(一)"&qu ...
- PHP基础入门(二)【PHP函数基础】
PHP基础入门(二)--函数基础 了解 PHP基础入门详解(一) 后,给大家分享一下PHP的函数基础. 这部分主要讲的就是: 函数的声明与使用.PHP中变量的作用域.静态变量.函数的参数传递.变量函数 ...
- 09-Python入门学习-函数基础与参数
一.函数基础 1.定义函数的三种形式 1.1 无参函数 def foo(): print('from foo') foo() 1.2 有参函数 def bar(x,y): print(x,y) bar ...
- Python学习day9 函数Ⅰ(基础)
函数Ⅰ(基础) 三目运算 基本结构 v = 前面 if 条件 else 后面 #条件为真v=前面,条件为假v=后面.#等同于if 条件: v = '前面'else: v = '后面' ...
- Python学习笔记-函数基础
函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...
- javaScript系列 [01]-javaScript函数基础
[01]-javaScript函数基础 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用.信息隐蔽和组合调用. 函数的创建:在javaScri ...
随机推荐
- QQ聊天机器人 Delphi代码
QQ聊天机器人 前几日,看到杂志上有一篇关于开发QQ聊天机器人的文章.谈到了对QQ循环发送消息内容,感觉倒也很好玩,于是拿起Delphi开始了我的QQ聊天机器人之路. 首先要明白自己要做什么, ...
- FP function programming
fp是函数式编程,也是一种编程方法,同面向对象的编程方法一样. 所谓的functional programming 就是函数式编程,这也是一种编程方法,或者说是编程模式,同面向过程的编程,以及面向对象 ...
- JS之缓冲动画
原素材 main.html <!DOCTYPE html> <html lang="en"> <head> <link href=&quo ...
- java_网络编程之上传文件案例
初期成果: 客户端: package FileUpload; import java.io.*; import java.net.Socket; import java.util.Scanner; p ...
- Jquery 遍历 Table;遍历CheckBox ;遍历Select;全选/全不选
关于Jquery:相信大家已经很熟悉了,我最近的项目运用到关于Jquery的遍历事件:权当总结下: 遍历Table <table id="thistab"> < ...
- 2019-8-31-C#-如何给-ValueTuple-返回值添加注释
title author date CreateTime categories C# 如何给 ValueTuple 返回值添加注释 lindexi 2019-08-31 16:55:58 +0800 ...
- python中遇到的问题:IndentationError: unexpected indent
在Python中写下列代码的时候,出现错误:IndentationError: unexpected indent 分析:IndentationError是缩进的错误,查看源代码发现names开始的这 ...
- IDE 插件新版本发布,开发效率 “biu” 起来了
近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明. 本地应用一键 ...
- 0809NOIP模拟测试赛后总结
终于有点脸单独建一个随笔写一下考试总结了…… T1一眼组合数学,推了一会儿式子发现恐怕是容斥.突然害怕,于是开始大力dp. 然后骗了70分走人hhh. T2挂了……又读错题了……以为必须相邻,然后就原 ...
- 第十四章 Odoo 12开发之部署和维护生产实例
本文中将学习将 Odoo 服务器作为生产环境的基本准备.安装和维护服务器是一个复杂的话题,应该由专业人员完成.本文中所学习的不足以保证普通用户创建应对包含敏感数据和服务的健壮.安全环境. 本文旨在介绍 ...