【PHP】解析PHP中的函数
目录结构:
在这篇文章中,笔者将会讲解如何使用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 \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); ?>
输出:
参数数量 : 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)."\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函数来调用一个函数。
<?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来传递在闭包中能够使用的父级属性。若有多个父级属性要在闭包中使用的话,那么在这些属性之前用逗号隔开就可以了。