目录结构:

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 \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中的函数的更多相关文章

  1. (转)解析PHP中ob_start()函数的用法

    本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下     ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行 ...

  2. 【OpenCV】解析OpenCV中copyMakerBorder函数

    Use the OpenCV function :copy_make_border:`copyMakeBorder <>` to set the borders (extra paddin ...

  3. 【原创】Matlab中plot函数全功能解析

    [原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...

  4. Matlab中plot函数全功能解析

    Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName ...

  5. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

  6. 【Python】解析Python中函数的基本使用

    1.简介 在Python中定义函数的基本格式为: def <函数名>(参数列表): <函数语句> return <返回值> Python中的函数形式比较灵活,声明一 ...

  7. 【dva】model中effects函数的解析

    结构 effects: { *pageQuery({ payload = {} }, { select, call, put }) { const res = yield call(pageQuery ...

  8. eval解析JSON中的注意点

       在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery ...

  9. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

随机推荐

  1. 了解一下vue源码中vue 的由来

     我们之前提到过 Vue.js 构建过程,在 web 应用下,我们来分析 Runtime + Compiler 构建出来的 Vue.js,它的入口是 src/platforms/web/entry-r ...

  2. 【JavaScript】浏览器

    No1: [window]全局作用域,而且表示浏览器窗口 innerWidth和innerHeight属性,可以获取浏览器窗口的内部宽度和高度.内部宽高是指除去菜单栏.工具栏.边框等占位元素后,用于显 ...

  3. POJ 2352 Stars【树状数组】

    <题目链接> 题目大意: 题目给出n个点,这些点按照y坐标的升序,若y相同,则按照x的升序顺序输入,问,在这些点中,左下角的点的数量分别在0~n-1的点分别有多少个,写出它们的对应点数. ...

  4. 基于netty的websocket例子

    nettyServer package com.atguigu.netty.websocket; import javax.annotation.PostConstruct; import org.s ...

  5. 001.NoSQL及MongoDB简介

    一 NoSQL简介 二 分布式系统 三 CAP及BASE定律 以上均可参考: http://www.runoob.com/mongodb/nosql.html 四 MongoDB简介 参考:http: ...

  6. iOS APP提交上架流程

    转载自CocoaChina,链接地址:http://www.cocoachina.com/bbs/read.php?tid=330302 后面问题我也遇到了,参考该文章解决的 转自http://blo ...

  7. PAT (Advanced Level) Practise 1004 解题报告

    GitHub markdownPDF 问题描述 解题思路 代码 提交记录 问题描述 Counting Leaves (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 1600 ...

  8. 2602 ACM 杭电 骨头容器 01背包

    题意:装骨头的容器大小固定,有一堆骨头,已知骨头的价值和大小,在不超过容积大小的情况下,问:所装骨头的最大价值? 思路:典型的01背包问题,不需要有任何的变动. 模板: for(int j=v;j&g ...

  9. Java发邮件基础篇

    1. 电子邮件协议 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP.其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP ...

  10. 潭州课堂25班:Ph201805201 django框架 第十一课 保持登录,注册,登录 (课堂笔记)

    保持登录 在 django 中的内置 sessions 在项目的主目录中的配置文件 在数据库中 在视图函数中写登录 在页面登录后会出现 查看数据库内容 这样就实现保持登录 退出登录 注册: 1,创建模 ...