【PHP】解析PHP中的函数

目录结构:javascript

contents structure [-]

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

1.可变参数函数

PHP中能够经过func_get_args函数得到参数数组的信息,或者经过func_get_args得到参数的数目。
func_get_args得到的是目标参数的副本组成的数组。

看以下的案例:java

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

foo(1, 2, 3);
?>

输出:c++

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

 

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

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)."\n";//3
$val = "subs";//将函数名"subs"赋给变量$val, 执行$val()时则调用函数subs()
echo $val(1,2)."\n";//-1
?>

3.回调函数

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

还能够经过call_user_func_array函数来调用一个函数。c#

<?php
namespace MyProject;//声明命名空间MyProject

class myClass{
    function myfunc($arg1,$arg2){
        echo " class name = ".__CLASS__."\n";
        echo " function name = ".__FUNCTION__."\n";
        echo " method name = ".__METHOD__."\n";
        echo " file dir = ".__DIR__."\n";
        echo " current line = ".__LINE__."\n";
        echo " name space = ".__NAMESPACE__."\n";
        
        echo " arg1 = ".$arg1."\n";
        echo " arg2 = ".$arg2."\n";
    }
}
$myClass = new namespace\myClass();
call_user_func_array(array($myClass,"myfunc"),array(1,2));
?>

输出结果以下:数组

 class name = MyProject\myClass
 function name = myfunc
 method name = MyProject\myClass::myfunc
 file dir = C:\wamp\www
 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)."\n";
print "octal  = ".$fun(20,8)."\n";
print "hex    = ".$fun(20,16)."\n";
?>

输出结果为:

binary = 10100
octal  = 24
hex    = 14

 

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