【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";//
$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来传递在闭包中能够使用的父级属性。若有多个父级属性要在闭包中使用的话,那么在这些属性之前用逗号隔开就可以了。
【PHP】解析PHP中的函数的更多相关文章
- (转)解析PHP中ob_start()函数的用法
本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下 ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行 ...
- 【OpenCV】解析OpenCV中copyMakerBorder函数
Use the OpenCV function :copy_make_border:`copyMakeBorder <>` to set the borders (extra paddin ...
- 【原创】Matlab中plot函数全功能解析
[原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...
- Matlab中plot函数全功能解析
Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName ...
- C++解析(16):友元与类中的函数重载
0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...
- 【Python】解析Python中函数的基本使用
1.简介 在Python中定义函数的基本格式为: def <函数名>(参数列表): <函数语句> return <返回值> Python中的函数形式比较灵活,声明一 ...
- 【dva】model中effects函数的解析
结构 effects: { *pageQuery({ payload = {} }, { select, call, put }) { const res = yield call(pageQuery ...
- eval解析JSON中的注意点
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
随机推荐
- Bi-shoe and Phi-shoe (欧拉函数)
题目描述: 题目大意:一个竹竿长度为p,它的score值就是比p长度小且与且与p互质的数字总数,比如9有1,2,4,5,7,8这六个数那它的score就是6.给你T组数据,每组n个学生,每个学生都有一 ...
- linux的文件打包与压缩
简介 Linux 上常用的压缩/解压工具,介绍了zip.rar.tar的使用. 文件打包和压缩 Linux 上的压缩包文件格式,除了 Windows 最常见的*.zip.*.rar..7z 后缀的压缩 ...
- 转 国内的go get问题的解决
转 国内的go get问题的解决 go get golang.org/x 包失败解决方法 由于各种问题,国内使用 go get 安装 golang 官方包可能会失败,如我自己在安装 colli ...
- go get 无反应、访问github.com速度慢、没反应问题的解决方案
go get 无反应.访问github.com速度慢.没反应问题的解决方案 昨天晚上装了个虚拟机,Centos7 安装都正常,网络访问也正常,但是打算安装beego的时候,把我给噎着了,无论是 ...
- 团队协作统一vue代码风格,vscode做vue项目时的一些配置
1. 安装Vetur 扩展 主要是用于让vscode能识别vue文件,对vue代码进行高丽处理,并且它内置了一些代码格式化的设置 2. 安装ESLint 如果你的项目已经开启了eslint规范, 再有 ...
- 大数据小白系列——HDFS(4)
这里是大数据小白系列,这是本系列的第四篇,来看一个真实世界Hadoop集群的规模,以及我们为什么需要Hadoop Federation. 首先,我们先要来个直观的印象,这是你以为的Hadoop集群: ...
- Java-从Double类型精度丢失认识BigDecimal
Java-从Double类型精度丢失认识BigDecimal 参考资料 https://www.jianshu.com/p/07e3eeb90f18 https://zh.wikipedia.org/ ...
- 2046 ACM 数学
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2046 思维:与之前有两道题目相似,n可以由n-1和n-2递推过来.f(n)=f(n-1)*1+f(n-2) ...
- Ajax状态值及状态码整理
1- AJAX状态值与状态码区别 AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤.如:正在发送,正在响应等,由AJAX对象与服务器交互 ...
- 冲刺NOIP复习,算法知识点总结
前言 离NOIP还有一个星期,匆忙的把整理的算法补充完善,看着当时的整理觉得那时还年少.第二页贴了几张从贴吧里找来的图片,看着就很热血的.当年来学这个竞赛就是为了兴趣,感受计算机之美的. ...