php函数基础(一)

php函数基础(一)

一.函数结构
 
1.构成部分: 
           关键字 function 
           函数名:get_sum
            参数列表:($a,$b)
            函数体:{}
            返回值:return $a+$b; 

      
php函数基础(一)           
2.函数命名规则:
  有效的函数名以字母或下划线开头,后面跟字母,数字或下划线,注意:不能用数字开头。
php函数基础(一)
 
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.可变参数列表
 
php函数基础(一)

//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空间不变化

php函数基础(一)
 

 

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警告性错误,后面的代码继续执行
 
 
 
 
 
 
 
 
 
 
 
 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112750.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月31日 上午6:00
下一篇 2021年10月31日 上午6:00


相关推荐

  • JPA @Modifying注解

    JPA @Modifying注解这个注解是通知 jpa 这是一个 update 或者 delete 操作 在更新或者删除操作时 此注解必须加 否则会抛出下面异常 org springframew dao InvalidDataA org hibernate hql internal QueryExecuti Notsupported

    2026年3月19日
    2
  • 站长工具之在线检测网页错误

    站长工具之在线检测网页错误网页代码测试工具  没有站长可以保证自己的网页代码完全正确没有任何错误,特别是是否符合W3C标准,你可以通过以下测试来检查网站代码是否正确,无论你是asp的还是php的都可以哟。  1.http://www.htmlhelp.com/tools/validator一个很好的工具,能找出网站语法错误的地方,并标注出来,也可选择对网站上单独的每一页进行单页分析。(强烈推荐)

    2022年7月22日
    12
  • CNN垃圾分类_垃圾分类卡通画

    CNN垃圾分类_垃圾分类卡通画基于TensorFlow和Keras的垃圾分类模型本篇博客主要介绍基于TensorFlow和Keras实现垃圾分类模型,目前是一篇占坑的博客,由于该项目目前用于参加比赛,因此暂时不能提供代码,感兴趣的可以私信我一起交流,识别结果如下所示:

    2022年10月6日
    7
  • 简单分析RLP编码原理

    简单分析RLP编码原理RLP 编码是以太坊数据序列化的主要方法 本文介绍 RLP 编码的主要规则和原理分析 RLP 编码具有较好的数据处理效率 尤其是将长度和类型统一作为前缀 实际上 RLP 是基于 ASCII 编码的一种结构化扩充 既能表示长度还能表示类型 是一种非常紧凑的结构化编码方案 RLP RecursiveLen 递归长度前缀 是一种编码算法 用于编码任意的嵌套结构的二进制数据 它是以太坊中数据

    2026年3月17日
    2
  • 后缀表达式、前缀表达式

    后缀表达式、前缀表达式后缀表达式和前缀表达式是什么呢 nbsp nbsp nbsp nbsp nbsp 前缀表达式 不包括括号的算术表达式 将运算符写在前面 操作数写在后面的表达式 为纪念其发明者波兰数学家 JanLukasiewc 也称 波兰式 nbsp nbsp nbsp nbsp nbsp 后缀表达式 不包括括号 运算符放在两个运算对象的后面 所有的计算按运算符出现的顺序 严格从左向右进行 也称 逆波兰式 nbsp nbsp nbsp nbsp nbsp 举个栗子 nbsp nbsp nbsp nbsp nbsp nbsp

    2026年3月19日
    2
  • eclipse开发c++时cout和endl报错

    eclipse开发c++时cout和endl报错

    2022年1月29日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号