PHP基础 函数 第八天

用户自定义函数

<?php
function xlxz($arg_1, $arg_2, ..., $arg_n)
{
    echo "只是一个范例.\n";
    return $retval;
}
?>

任何有效的 PHP 代码都有可能出现在函数内部,甚至包括其它函数和类定义。  

   函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。可以用正则表达式表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

条件函数,函数中的函数,函数必须在其调用之前定义。

条件函数

<?php 

$makefoo = true; 

/* 我们不能在处调用xlxz()函数,
   因为它还不存在,但可以调用php()函数。*/

php(); 

if ($makefoo) {
  function xlxz()
  {
    echo " 这是条件函数.\n";
  }
} 

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

if ($makefoo) xlxz(); 

function php()
{
  echo "这是PHP()函数.\n";
} 

?>

函数中的函数

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

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

xlxz(); 

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

php(); 

?>

PHP 中的所有函数和类都具有全局作用域,可以在内部定义外部调用,反之亦然。  

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

Note:     函数名是大小写无关的,不过在调用函数的时候,通常使用其在定义时相同的形式。

在 PHP 中可以调用递归函数。但是要避免递归函数/方法调用超过    100-200 层,因为可能会破坏堆栈从而使当前脚本终止。

递归函数

<?php
function recursion($a)
{
    if ($a < 20) {
        echo "$a 小于 20 在次调用recursion()\n";
        recursion($a + 1);
    }
}
?>

函数的参数


通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。



PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数。也支持可变数量的参数;



向函数传递数组


<?php
function takes_array($input)
{
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>


通过引用传递参数



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

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



用引用传递函数参数


<?php
function add_some_extra(&$string)
{
    $string .= '这是函数内的.';
}
$str = '这是一个字符串, ';  

add_some_extra($str);  

echo $str;    // 这是一个字符串,这是函数内的  

?>


在函数中使用默认参数


<?php
function makecoffee($type = "默认")
{
    return "php.xlxz.org $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
/*
 *  输出:
 *  php.xlxz.org 默认.
 *  php.xlxz.org.
 *  php.xlxz.org espresso.
 */
?>


PHP 还允许使用数组和特殊类型 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
function makeyogurt($type = "acidophilus", $flavour)
{
    return "Making a bowl of $type $flavour.\n";
} 

echo makeyogurt("raspberry");   // 这会产生一个错误
?>


函数默认参数正确的用法


<?php
function makeyogurt($flavour, $type = "acidophilus")
{
    return "Making a bowl of $type $flavour.\n";
} 

echo makeyogurt("raspberry");   // 这样子就不会有错了
?>


返回值



值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。更多信息见    return()



return() 的使用


<?php
function js_php($num)
{
    return $num * $num;
}
echo js_php(4);   // 输出 '16'.
?>



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

<?php
function small_numbers()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>


从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :

<?php
function &returns_reference()
{
    return $someref;
} 

$newref =& returns_reference();
?>