• 【PHP】解析PHP中的函数


    目录结构:

    contents structure [-]

    在这篇文章中,笔者将会讲解如何使用PHP中的函数,PHP是一门弱语言类型,相比较于强语言类型(java、c++,c#等),在函数方面也提供了更大的灵活性。

    1.可变参数函数

    PHP中可以通过func_get_args函数获得参数数组的信息,或者通过func_get_args获得参数的数目。
    func_get_args获得的是目标参数的副本组成的数组。

    看如下的案例:

    <?php
    function foo()
    {
        $numargs = func_num_args();
        echo "参数数量 : $numargs 
    ";
        if ($numargs >= 2) {//获得第二个参数的值
            echo "第二个参数是: " . func_get_arg(1) . "
    ";
        }
        $arg_list = func_get_args();
        for ($i = 0; $i < $numargs; $i++) {
            echo "参数  $i 是: " . $arg_list[$i] . "
    ";
        }
    }
    
    foo(1, 2, 3);
    ?>

    输出:

    参数数量 : 3
    第二个参数是: 2
    参数  0 是: 1
    参数  1 是: 2
    参数  2 是: 3

    在PHP5.6及以上版本中,提供了...的语法格式来支持可变参数。

    2.变量函数

    <?php
    function add($a,$b){
        return $a + $b;
    };
    function subs($a,$b){
        return $a - $b;
    };
    $val = "add";//将函数名"add"赋给变量$val, 执行$val()时则调用函数add()
    echo $val(1,2)."
    ";//3
    $val = "subs";//将函数名"subs"赋给变量$val, 执行$val()时则调用函数subs()
    echo $val(1,2)."
    ";//-1
    ?>

    3.回调函数

    <?php
    function cal($fun){
        for($i = 0;$i < 100 ;$i++){
            if( $fun($i) ){
                echo $i."
    ";
            }
        }
    };
    //如果是回文数就返回true,否则false
    function val($num){
        if($num == strrev($num))
            return true;
        return false;
    }
    cal("val");
    ?>

    还可以通过call_user_func_array函数来调用一个函数。

    <?php
    namespace MyProject;//声明命名空间MyProject
    
    class myClass{
        function myfunc($arg1,$arg2){
            echo " class name = ".__CLASS__."
    ";
            echo " function name = ".__FUNCTION__."
    ";
            echo " method name = ".__METHOD__."
    ";
            echo " file dir = ".__DIR__."
    ";
            echo " current line = ".__LINE__."
    ";
            echo " name space = ".__NAMESPACE__."
    ";
            
            echo " arg1 = ".$arg1."
    ";
            echo " arg2 = ".$arg2."
    ";
        }
    }
    $myClass = new namespacemyClass();
    call_user_func_array(array($myClass,"myfunc"),array(1,2));
    ?>

    输出结果如下:

     class name = MyProjectmyClass
     function name = myfunc
     method name = MyProjectmyClass::myfunc
     file dir = C:wampwww
     current line = 10
     name space = MyProject
     arg1 = 1
     arg2 = 2

    其中:
    __CLASS__ 类名称
    __METHOD__ 方法名称
    __FUNCTION__ 函数名称。
    __DIR__ 文件目录
    __LINE__ 当前行
    __NAMESPACE__ 命名空间

    call_user_func_array只接受两个参数,第一个是函数名,如果是引用类型,那么就应该使用数组。第二个是一个数组参数。

    4.自定义函数库

    自定义函数库需要使用到include和require方法,这两个方法都可以用于引入别的php文件。但是include方法在遇到错误后,脚本会继续执行。require方法在引入文件遇到错误后,脚本不会继续执行。
    定义一个php文件,文件名为test1.php:

    <?php
    echo "I come from another php file<br/>";

    然后再定义一个文件,文件名test2.php:

    <?php
    
    include 'test1.php';
    
    echo "<hr/>";
    
    echo "I am this file content";

    然后通过web浏览器,会看到如下输出结果:


    在test2.php文件中成功引入了test1.php文件的内容。
    require和include的功能类似,但是require在引入过程中,遇到错误的话,会终止脚本的执行。

    如果我们执行如下代码:

    <?php
    
    include 'test3.php';

    其中test3.php文件不存在,这时候include会产生警告。

    如果换成require的话,就会产生致命错误。


    include和require每包含一次文件就会执行文件中的内容,如果只需要在最开始包含那次执行文件的内容,那么就可以用include_once()和require_once()方法。

    5.闭包(Closure)的使用

    PHP 5.3新添加了闭包的功能,PHP中的闭包目前和别的语言的闭包(比如javascript)不一样,javascript可以被认为是一种作用域,它默认继承父容器的作用域。然而在PHP中,必需手动绑定传递的参数。
    看下面的案例:

    <?php
    function Calc($frombase){
        return function($number,$tobase) use($frombase){
            return base_convert($number, $frombase, $tobase);//转化为指定进制
        };
    }
    //得到一个从10进制开始转化的匿名函数
    $fun = Calc(10);
    
    print "binary = ".$fun(20,2)."
    ";
    print "octal  = ".$fun(20,8)."
    ";
    print "hex    = ".$fun(20,16)."
    ";
    ?>

    输出结果为:

    binary = 10100
    octal  = 24
    hex    = 14

    在上面的代码中使用use来传递在闭包中能够使用的父级属性。若有多个父级属性要在闭包中使用的话,那么在这些属性之前用逗号隔开就可以了。



  • 相关阅读:
    ASP.NET Core "完整发布,自带运行时" 到jexus
    Exploring Message Brokers: RabbitMQ, Kafka, ActiveMQ, and Kestrel--reference
    如何给Windows Server 2012 R2 添加“磁盘清理”选项
    win8、server 2012 清除winsxs文件夹
    win10企业版永久激活2017怎么用
    WCF Routing服务,负载均衡
    Net分布式系统之五:C#使用Redis集群缓存
    Net分布式系统之四:RabbitMQ消息队列应用
    Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用
    Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)
  • 原文地址:https://www.cnblogs.com/HDK2016/p/10191157.html
Copyright © 2020-2023  润新知