PHP中的函数

概述

函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线

函数名是大小写无关的,不过在调用函数的时候,使用其在定义时相同的形式是个好习惯

PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数


函数的定义

<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
    echo "Example function.\n";
    return $retval;
}
?>

当一个函数是有条件被定义时,必须在调用函数之前定义

<?php

$makefoo = true;

/* 不能在此处调用foo()函数,
   因为它还不存在,但可以调用bar()函数。*/

bar();

if ($makefoo) {
  function foo()
  {
    echo "I don‘t exist until program execution reaches me.\n";
  }
}

/* 现在可以安全调用函数 foo()了,
   因为 $makefoo 值为真 */

if ($makefoo) foo();

function bar()
{
  echo "I exist immediately upon program start.\n";
}

?>

函数中的函数

<?php
function foo()
{
  function bar()
  {
    echo "I don‘t exist until foo() is called.\n";
  }
}

/* 现在还不能调用bar()函数,因为它还不存在 */

foo();

/* 现在可以调用bar()函数了,因为foo()函数
   的执行使得bar()函数变为已定义的函数 */

bar();

?>

函数的参数

值传递与引用传递

默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。

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

<?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.‘
?>

默认参数

注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧

默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等

<?php
function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
?>

还允许使用数组 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");
?>

可变数量的参数

在 PHP 5.6 及以上的版本中,由 ... 语法实现可变数量的参数列表

<?php
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);
?>

在PHP5.5及更早版本,可以用func_num_args(), func_get_arg()func_get_args()实现

func_num_args()返回参数的个数

<?php
function foo()
{
    $numargs = func_num_args();
    echo "Number of arguments: $numargs\n";
}

foo(1, 2, 3);
?>

func_get_args()返回一个包含函数参数列表的数组

<?php
function sum() {
    $acc = 0;
    foreach (func_get_args() as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);
?>

func_get_arg()返回参数列表的某一项,参数从0开始

<?php
function foo()
{
     $numargs = func_num_args();
     echo "Number of arguments: $numargs<br />\n";
     if ($numargs >= 2) {
         echo "Second argument is: " . func_get_arg(1) . "<br />\n";
     }
}

foo (1, 2, 3);
?>

返回值

如果省略了 return,则返回值为 NULL

函数不能返回多个值,但可以通过返回一个数组来得到类似的效果


可变函数

这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它

<?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()
?>

匿名函数

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

<?php
echo preg_replace_callback(‘~-([a-z])~‘, function ($match) {
    return strtoupper($match[1]);
}, ‘hello-world‘);
// 输出 helloWorld
?>

匿名函数赋给一个变量,最后也要加上分号

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

$greet(‘World‘);
$greet(‘PHP‘);
?>

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

<?php
$message = ‘hello‘;

// 没有 "use"
$example = function () {
    var_dump($message);
};
echo $example(); // NULL

// 继承 $message
$example = function () use ($message) {
    var_dump($message);
};
echo $example(); // hello

// Inherited variable‘s value is from when the function
// is defined, not when called
$message = ‘world‘;
echo $example(); // hello

// Reset message
$message = ‘hello‘;

// Inherit by-reference
$example = function () use (&$message) {
    var_dump($message);
};
echo $example(); // hello

// The changed value in the parent scope
// is reflected inside the function call
$message = ‘world‘;
echo $example(); // world

// Closures can also accept regular arguments
$example = function ($arg) use ($message) {
    var_dump($arg . ‘ ‘ . $message);
};
$example("hello"); // hello world
?>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 10:26:43

PHP中的函数的相关文章

C++中的函数对象(一)

STL中的函数对象,大多数STL类属算法(以及某些容器类)可以以一个函数对象作为参数.引入函数对象的目的是为了使算法的功能富于变化,从而增强算法的通用性. 所谓函数对象,是指一段代码实体,它可以不带参数,也可以带有若干参数,其功能是获得一个值,或者改变操作的状态.在C++编程中,任何普通的函数都满足这个定义,而且,任何一个重载了运算符operator()的类的对象也都满足这一定义,称为函数对象. 普通函数 int multfun(int x, int y) { return x*y; } 或者下

Oracle 中 decode 函数用法

Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IFdecode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值

js中一些函数(一)【丫头, 今天去哪儿了呢,好些没有】

Math.Rondom()   ==>  0 到 1 之间的小数 Math.floor(x)  ==>  小于或者等于 x 的整数(即转换成整数后是不能比 x 大的整数) setInterval(hanshu,1000)  ==>  意思为调用下面的 hanshu(), 间隔时间为 1000 ms(毫秒) js中一些函数(一)[丫头, 今天去哪儿了呢,好些没有],码迷,mamicode.com

Mysql中的函数

阅读目录 什么是函数 与存储过程的区别 mysql自带函数 自定义函数 什么是函数 mysql中的函数与存储过程类似,都是一组SQL集: 与存储过程的区别 函数可以return值,存储过程不能直接return,但是有输出参数可以输出多个返回值: 函数可以嵌入到sql语句中使用,而存储过程不能: 函数一般用于实现较简单的有针对性的功能(如求绝对值.返回当前时间等),存储过程用于实现复杂的功能(如复杂的业务逻辑功能): mysql自带函数 mysql本身已经实现了一些常见的函数,如数学函数.字符串函

javascript中所有函数的参数都是按值传递的

[javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm

程序代码中退出函数exit()与返回函数return ()的区别

  exit(0):正常运行程序并退出程序:   exit(1):非正常运行导致退出程序:   return():返回函数,若在主函数中,则会退出函数并返回一值.  解析: 1. return返回函数值,是关键字: exit 是一个函数. 2. return是语言级别的,它表示了调用堆栈的返回:而exit是系统调用级别的,它表示了一个进程的结束. 3. return是函数的退出(返回):exit是进程的退出. 4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的).ex

JavaScript闭包中闭包函数this的指向

阅读文章前, 请先阅读阮一峰老师的这篇文章http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 前人写过的, 而且写得很好, 就没必要重复下去了. 只加一些阮老师的文章里没有说的.顺便总结一下. 引用一句话: "闭包就是functions that return function"(出处已经忘记啦) 闭包的类型: 循环闭包, 函数闭包 闭包的特点: 外部访问函数内部的值, 函数内部变量不被回收

想精度高,可以考虑用c语言中的函数gettimeofday

大家好: 在 win32 + bcb 时, 有个 GetTickCount() 返回第统启动到现在的 tick, 单位 ms.请问在 Linux + qt5 怎样实现呢? 如果用 QDateTime , 精度只能到秒,而且运行过程中,如果用户改充了系统时间,就会出错了. 用QElapsedTimer. 想精度高,可以考虑用c语言中的函数gettimeofday,微秒级精度 #include <sys/time.h>int gettimeofday(struct timeval*tv, stru

如何使用 JDBC 调用存储在数据库中的函数或存储过程

JDBC调用存储过程步骤:1 通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例.在使用Connection对象的prepareCall()方法时,需要传入一个String类型的字符串,该字符串用于指明如何调用存储过程{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} {call <procedure-name>[(<arg1>,<a

在C++工程中main函数之前跑代码的廉价方法(使用全局变量和全局函数)

[cpp] view plain copy // test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <crtdbg.h> /// 在C++工程中main函数之前跑代码的廉价方法 /// 利用全局变量可以赋可变初值的事实 /// mainCRTStartup() => _cin