前面的话

  PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数。本文将详细介绍php函数

  [注意]关于javascript函数的详细内容移步至此

函数定义

  除了内建的 PHP 函数,可以创建我们自己的函数。函数是可以在程序中重复使用的语句块。页面加载时函数不会立即执行。函数只有在被调用时才会执行。

  用户定义的函数声明以关键字 "function" 开头,函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线

function functionName() {
被执行的代码;
}
<?php
function writeMsg() {
echo "Hello world!";
}
writeMsg(); // 调用函数
?>

函数参数

  可以通过参数向函数传递信息,参数类似变量。参数被定义在函数名之后,括号内部。可以添加任意多参数,只要用逗号隔开即可

<?php
function familyName($fname) {
echo "$fname Zhang.<br>";
} familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
?>

引用传递

  默认情况下,函数参数通过值传递。如果希望允许函数修改它的参数值,必须通过引用传递参数

  如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &

<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
?>

默认参数

  函数可以定义 C++ 风格的标量参数默认值

<?php
function setHeight($minheight=50) {
echo "The height is : $minheight <br>";
} setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>

  PHP 还允许使用数组 array 和特殊类型 NULL 作为默认参数

<?php
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
return "Making a cup of ".join(", ", $types)." with $device.\n";
}
echo makecoffee();
echo makecoffee(array("cappuccino", "lavazza"), "teapot");
?>

  [注意]当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作

可变参数

【func_get_args()】

  func_get_args()相当于javascript函数中的arguments,以数组形式保存着实参

function demo(){
$arr = func_get_args();
$sum = 0;
for($i = 0; $i<count($arr); $i++){
$sum += $arr[$i];
}
return $sum;
}
//
echo demo(1,2,3,4,5,6,7,8,9);

  此外,还有两个常用的函数func_num_args()和func_get_arg()

  func_num_args()函数返回参数总数

  func_get_arg()函数接收一个数字参数,返回指定参数

function more_args() {
for($i=0; $i<func_num_args(); $i++) {
echo "第".$i."个参数是".func_get_arg($i)."<br>";
}
}
more_args("one", "two", "three", 1, 2, 3);

返回值

  如需使函数返回值,使用 return 语句。如果省略了return,则返回值为 NULL

<?php
function sum($x,$y) {
$z=$x+$y;
return $z;
} echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>

变量函数

  变量函数也叫可变函数。如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途

  [注意]可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数

<?php
function foo() {
echo "In foo()<br />\n";
} function bar($arg = '') {
echo "In bar(); argument was '$arg'.<br />\n";
} // 使用 echo 的包装函数
function echoit($string)
{
echo $string;
} $func = 'foo';
$func(); // This calls foo() $func = 'bar';
$func('test'); // This calls bar() $func = 'echoit';
$func('test'); // This calls echoit()
?>

回调函数

  回调函数是指将一个函数的函数名作为参数传到另一个函数中

function demo($num,$n){
for($i=0;$i<$num;$i++){
if($n($i)){
echo $i.'<br>';
}
}
} function test($i){
if($i%5){
return true;
}
} demo(20,'test');

call_user_func_array

  使用call_user_func_array可以调用回调函数,并把一个数组参数作为回调函数的参数

mixed call_user_func_array ( callable $callback , array $param_arr )

  把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入

function demo($num,$n){
for($i=0;$i<$num;$i++){
if(call_user_func_array($n,array($i))){
echo $i.'<br>';
}
}
} function test($i){
if($i%5){
return true;
}
} demo(20,'test');

  实现回调函数时,通常要使用call_user_func_array()函数,而不是变量函数,因为变量函数无法传递对象中的方法或和类中的静态方法

function demo($num, $n) {
for($i=0; $i<$num; $i++) {
if(call_user_func_array($n, array($i))){
echo $i."<br>";
}
}
} class Filter {
function one($i) {
if($i%3==0) {
return true;
}
}
static function two($i) {
if(preg_match('/3/', $i)) {
return true;
}
} }
demo(500, array(new Filter(), "one"));
demo(500, array("Filter", "two"));

递归函数

  在函数中调用自己就是递归函数

<?php
function test( $n ) {
echo $n;
if($n>0){
test($n-1);
}
echo $n;
}
test(5);//
?>

加载函数库

  使用include()函数来引入外部文件

test.php
function one(){
echo '111';
} <?php
include ('test.php');
one();//
?>

  但如果不慎引入多次,使得函数重定义,变量重新赋值,会造成错误

test.php
function one(){
echo '111';
} <?php
include ('test.php');
include ('test.php');
one();//
?>

  此时,需要使用include_once()函数,来保证相同的文件只被引入一次

test.php
function one(){
echo '111';
} <?php
include_once('test.php');
include_once('test.php');
one();//
?>

require()

  引入外部文件,还可以使用require()。include( )与require( )几乎等价,区别在于当处理失败时,include( )产生一个警告而require( )则导致一个致命错误

  [注意]require_once()与include()_once也类似

匿名函数

  匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值

  其实,php的匿名函数类似于javascript中的函数表达式

  [注意]匿名函数结尾一定要加分号,否则会报错

<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
}; $greet('World');
$greet('PHP');
?>

闭包

  PHP闭包实现主要就是靠匿名函数

  将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。

  闭包的两个特点:

  1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。

  2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

  其实上面两点可以合成一点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈区依然保留

  闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去

$message = 'hello';

$example = function () use ($message) {
var_dump($message);
};
echo $example();//string 'hello' (length=5)

前端学PHP之函数的更多相关文章

  1. 从头开始学JavaScript (七)——函数

    原文:从头开始学JavaScript (七)--函数 一.return 函数在执行完return之后停止并立即退出. return返回值:与return: 如下两个例子: function sum(n ...

  2. 前端学做 PPT

    前端学做 PPT 公司做技术分享.年终总结都需要用到ppt. 要快速.省事的做出高质量的 ppt,一方面需要熟练使用制作 ppt 的工具,另一方面得知道用工具做成什么样子才是好作品.前者比较简单,后者 ...

  3. 前端学PHP之字符串函数

    × 目录 [1]特点 [2]输出 [3]空格[4]大小写[5]HTML[6]格式化[7]比较 前面的话 字符串的处理和分析在任何编程语言中都是一个重要的基础,往往是简单而重要的.信息的分类.解析.存储 ...

  4. 前端学PHP之数组函数

    × 目录 [1]键值操作 [2]记数[3]回调函数[4]组合[5]栈和队列[6]顺序 前面的话 PHP中的数组功能非常强大,数组处理函数有着强大.灵活.高效的特点.PHP5提供了近100个操作数组的系 ...

  5. 前端学PHP之正则表达式函数

    前面的话 正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配.查找.替换及分割等操作.前面介绍了正则表达式的基础语法,本文将详细介绍正 ...

  6. 前端学HTTP之网络基础

    × 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...

  7. 前端学习之回调函数、call方法、apply方法

    今天学习的内容比较少,大部分时间是自己在写qq音乐和京东移动端的页面.现在说说今天学到的内容: 首先,回调函数,就是在函数内部中调用另外一个函数, 将一个函数当作参数传给另一个函数,被传的函数叫做回调 ...

  8. 我也要学iOS逆向工程--函数

    大家好,这篇我开始学习函数了.先学 C 函数,然后再 OC 的吧.OC 应该复杂点的吧. 然后看看汇编情况哦! 学习函数呢,肯定要弄清楚几个事情. 1.跳转地址. 2.返回地址 3.参数 4.函数获取 ...

  9. 前端学PHP之自定义模板引擎

    前面的话 在大多数的项目组中,开发一个Web程序都会出现这样的流程:计划文档提交之后,前端工程师制作了网站的外观模型,然后把它交给后端工程师,它们使用后端代码实现程序逻辑,同时使用外观模型做成基本架构 ...

随机推荐

  1. CSS中各种各样居中方法的总结

    在开发前端页面的时候,元素的居中是一个永远都绕不开的问题.看似简单的居中二字,其实蕴含着许许多多的情况,对应着很多的处理方法,本文就试图对页面布局中的居中问题进行总结~~ 居中问题分为水平居中和竖直居 ...

  2. 网络流dinic实现总结

    太羞耻了,搞了半天居然没发现自己写的不是dinic,直到被一道时限紧的题目卡掉才发现 int dfs(int now,int flow,int sum) { if(now==n) return flo ...

  3. 关于Web服务器的认识

    马上就要毕业了,也要开始找工作了,大学写了这么多代码了,却没有好好总结一下常用的概念很是遗憾额,就通过这篇博客记录一下我最常用的一些知识好了. 说到Web服务器,有很多文章都介绍的很好,之前看到一篇非 ...

  4. Hibernate中Criteria的完整用法

    1,CriteriaHibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .2,De ...

  5. Essential controls for web app

    AUTO-COMPLETE/AUTO-SUGGEST Auto-complete using Vaadin Offer auto-suggest or auto-complete to help yo ...

  6. 运用TensorFlow处理简单的NLP问题

    当前无论是学术界还是工业界,深度学习都受到极大的追捧,尤其是在Google开源深度学习平台TensorFlow之后,更是给深度学习火上浇油.目前在开源社区Github上所有开源项目中,TensorFl ...

  7. GitHub for Windows 內建 Git Shell 執行時顏色所代表的意義

    在使用指令列版控的過程中,經常有機會用到 Git Shell 這套優異的 Git 版控環境,一來他使用 Windows PowerShell 為核心,其訊息顯示與輸入都支援 Unicode,比較不會有 ...

  8. Odoo 报表中添加空格

    如果  不起作用,请用 代替.

  9. 删除mysql binlog日志

    查看:mysql> show binary logs; 删除 mysql-bin.000200 之前binlog日志:mysql> purge binary logs to 'mysql- ...

  10. Tree菜单 复选框选中控制DEMO

    java 对应实体类属定义 public class AccoSysmanResource{        /**     * 资源类型     */    private Integer resou ...