一.函数结构
 
1.构成部分: 
           关键字 function        
            函数名:get_sum
            参数列表:($a,$b)
            函数体:{}
            返回值:return $a+$b; 
2.函数命名规则:
  有效的函数名以字母或下划线开头,后面跟字母,数字或下划线,注意:不能用数字开头。
3.返回值
    值通过使用可选的返回语句返回;
   可以返回包括数组或对象的任意字符;
    返回语句会终止函数的运行,并将控制权交回调用该函数的代码行。
4.形参,实参 --形参与实参是一一对应的;
        1>当实参数目小于形参数目时报错,给出警告信息,
        2>当实参数目多于形参数目时,截取和形参数目相等的参数,实参可以是表达式,可以是常量,变量
5.默认值
      如果调用函数时传递参数有值,实际参数代替默认值;如果没有值,函数体内使用默认 值;
    默认值只能是常量或表达式;不能是变量;
    如 function get_geece($is_formate=flase)
    或function  get_geece($is_formate=2-1)
           3.>默认值只能在形参的右边,否则报错
6.强类型参数
    一般情况,简单类型参数之间是可以相互转化的:
        1> 整型开头的字符串+数字=数字
         2> 浮点型开头的字符串+数字=数字
         3>字符串开头的串+字符串开头的串=0
强类型参数定义:为参数列表中的参数指定类型,如果如果传入的数据类型不匹配,则抛出TypeError异常。
   支持类型:
在php7.0中:支持int,float,bool,string
默认普通模式,开启严格模式,declare(strict_types=1);  
7.可变参数列表
//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 )。
说明 : 返回传递到目前定义函数的参数数目。如果是从函数定义的外面来呼叫此函数,则func_get_arg( )将会产生警告。
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()函数传回一数组,数组的各个元素相当于是目前使用者定义函式的参数列的数目。
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
 
 
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警告性错误,后面的代码继续执行
 
 
 
 
 
 
 
 
 
 
 
 

php函数基础(一)的更多相关文章

  1. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  2. JavaScript 函数基础

    1. JavaScript 函数基础 1. 定义方法 2. 函数的调用方法 3. 函数方法 apply : 将函数作为数组的方法来调用 将参数以数组形式传递给该方法 call   : 将函数作为对象的 ...

  3. Python 函数基础、有序集合、文件操作(三)

    一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...

  4. 【2017-03-05】函数基础、函数四种结构、ref和out参数、递归

    一.函数基础 1.函数/方法:非常抽象独立完成某项功能的一个个体 2.函数的作用: 提高代码的重用性提高功能开发的效率提高程序代码的可维护性 3.分类 固定功能函数高度抽象函数 4.函数四要素:输入, ...

  5. PHP基础入门(三)---PHP函数基础

    PHP基础入门(三)---函数 今天来给大家分享一下PHP的函数基础.有了前两章的了解,想必大家对PHP有了一定的基础了解.想回顾前两章的朋友可以点击"PHP基础入门(一)"&qu ...

  6. PHP基础入门(二)【PHP函数基础】

    PHP基础入门(二)--函数基础 了解 PHP基础入门详解(一) 后,给大家分享一下PHP的函数基础. 这部分主要讲的就是: 函数的声明与使用.PHP中变量的作用域.静态变量.函数的参数传递.变量函数 ...

  7. 09-Python入门学习-函数基础与参数

    一.函数基础 1.定义函数的三种形式 1.1 无参函数 def foo(): print('from foo') foo() 1.2 有参函数 def bar(x,y): print(x,y) bar ...

  8. Python学习day9 函数Ⅰ(基础)

    函数Ⅰ(基础) 三目运算 基本结构 v =  前面  if 条件 else 后面    #条件为真v=前面,条件为假v=后面.​#等同于if 条件: v = '前面'else:    v = '后面' ...

  9. Python学习笔记-函数基础

    函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...

  10. javaScript系列 [01]-javaScript函数基础

    [01]-javaScript函数基础 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用.信息隐蔽和组合调用. 函数的创建:在javaScri ...

随机推荐

  1. Vue+Iview+Node 搭建数据模拟接口

    1.初始化node 项目 2.安装需要部件 3.编写简单代码 routers=>:index.js  login.js  users.js 根目录 index.js var express=re ...

  2. iserver中的服务数据迁移

    今天需要将iserver测试服务器上的空间数据服务(数据源是Oracle Plus)迁移到客户的正式服务器,原想需要很大的工作量,其实是这样简单: 一.保证客户的iserver环境都已安装正确.对于o ...

  3. HDU-1852-Beijing 2008-一个神奇的公式求逆元

    As we all know, the next Olympic Games will be held in Beijing in 2008. So the year 2008 seems a lit ...

  4. 6_3.springboot2.x数据整合Mybatis(注解和非注解)

    1.配置文件 pom.xml 导入mybatis提供的启动器 <dependency> <groupId>org.mybatis.spring.boot</groupId ...

  5. 面试系列13 redis都有哪些数据类型

    (1)string 这是最基本的类型了,没啥可说的,就是普通的set和get,做简单的kv缓存 (2)hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象 ...

  6. CodeForces 258D Little Elephant and Broken Sorting(期望)

    CF258D Little Elephant and Broken Sorting 题意 题意翻译 有一个\(1\sim n\)的排列,会进行\(m\)次操作,操作为交换\(a,b\).每次操作都有\ ...

  7. web.xml中多个Servlet执行顺序的问题!

    1.两个servlet或者两个servlet-mapping,其中的servlet-name名称不能存在相同. 2.所有的servlet-mapping标签下,url-pattern中包含的文本不能相 ...

  8. PostgreSQL问题解决--连接数过多

    I am trying to connect to a Postgresql database, I am getting the following Error: Error:org.postgre ...

  9. leetcode-第五场双周赛-1134-阿姆斯特朗数

    第一次提交: class Solution: def isArmstrong(self, N: int) -> bool: n = N l = len(str(N)) res = 0 while ...

  10. centos7.2安装apache比较简单,直接上代码

    centos7.2安装apache比较简单,直接上代码 1.安装 yum install httpd    2.启动apache systemctl start httpd.service    3. ...