21 12
发新话题
打印

第五讲 - 函数 2008-1-4

本主题由 Mars 于 2008-1-9 23:11 移动

第五讲 - 函数 2008-1-4

一. 用户自定义函数
       一个函数可由以下的语法来定义:
       例1:展示函数用途的伪码
复制内容到剪贴板
代码:
<?php
function foo ($arg_1, $arg_2, ..., $arg_n)
{
   echo "Example function.\n";
   return $retval;
}
?>
任何有效的 PHP 代码都有可能出现在函数内部,甚至包括其它函数和 类 定义。

在 PHP 3 中,函数必须在被调用之前定义。而 PHP 4 则不再有这样的 条件。除非函数如以下两个范例中有条件的定义。

如果一个函数以以下两个范例的方式有条件的定义,其定义必须在调用之前完成。

      例2:有条件的函数
复制内容到剪贴板
代码:
<?php

$makefoo = true;

/* 这里不能调用foo(),因为它不存在。但是可以调用bar() */

bar();

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

/*
现在可以调用foo()了,因为$makefoo被赋值为 true
*/

if ($makefoo) foo();

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

?>
例3:函数中的函数
复制内容到剪贴板
代码:
<?php
function foo()
{
  function bar()
  {
   echo "I don't exist until foo() is called.\n";
  }
}

/*
  这个时候我们还不可以调用bar(),因为他还不存在。
*/

foo();

/*现在可以调用bar(),因为调用了foo(),从而创建了bar()函数 */

bar();
?>  
PHP 不支持函数重载,可能也不支持取消定义或者重定义已声明的函数。
引用:
注: 函数名是非大小写敏感的,不过在调用函数的时候,通常使用其在定义时相同的形式。
PHP 4 支持: 见 可变长度的参数列表 和涉及到的相关函数 func_num_args(), func_get_arg(), 和 func_get_args() 以获取更多的信息。

二. 函数的参数

通过参数列表可以传递信息到函数,该列表是以逗号作为分隔符的变量和常量列表。

PHP 支持按值传递参数(默认), 通过引用传递, 和 默认参数值. 可变长度参数列表仅在 PHP 4 和后续版本中支持;更多信息请参照 可变长度参数列表 和涉及到的相关函数 func_num_args(), func_get_arg(), 和 func_get_args()。 PHP 3 中通过传递一个数组参数可以达到类似的效果:

例4:向函数传递数组
复制内容到剪贴板
代码:
<?php
function takes_array($input)
{
   echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>
通过引用传递参数

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

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

例5:用引用传递函数参数
复制内容到剪贴板
代码:
<?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++ 风格的标量参数默认值,如下:

例6:用引用传递函数参数
复制内容到剪贴板
代码:
<?php
function makecoffee ($type = "cappuccino")
{
   return "Making a cup of $type.\n";
}
echo makecoffee ();
echo makecoffee ("espresso");
?>
上述片断的输出是:
复制内容到剪贴板
代码:
Making a cup of cappuccino.
Making a cup of espresso.
默认值必须是常量表达式,不是(比如)变量,类成员,或者函数调用。
请注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则, 可能函数将不会按照预期的情况工作。考虑下面的代码片断:

例7: 函数默认参数不正确的用法
复制内容到剪贴板
代码:
<?php
function makeyogurt ($type = "acidophilus", $flavour)
{
   return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt ("raspberry");  // won't work as expected
?>
现在,比较上面的例子和这个例子:

例8: 函数默认参数正确的用法
复制内容到剪贴板
代码:
<?php
function makeyogurt ($flavour, $type = "acidophilus")
{
   return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt ("raspberry");  // works as expected
?>
这个例子的输出是: Making a bowl of acidophilus raspberry.

可变长度参数列表
PHP 4 已经在用户自定义函数中支持可变长度参数列表。这个真的很简单, 使用 func_num_args(),func_get_arg(),和 func_get_args() 函数.

无需特别的语法,参数列表仍然能够被明确无误的传递给函数并且正常运转。

三. 函数的参数
值通过使用可选的返回语句返回。任何类型都可以返回,其中包括列表和对象。 这导致函数立即结束它的运行,并且将控制权传递回它被调用的行。

例9:return() 函数的用法
复制内容到剪贴板
代码:
<?php
function square ($num)
{
   return $num * $num;
}
echo square (4);  // outputs '16'.
?>
函数不能返回多个值,但为了获得简单的结果,可以返回一个列表。

例10:返回一个数组以得到多个返回值
复制内容到剪贴板
代码:
<?php
function small_numbers()
{
   return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>
从函数返回一个引用,你必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :

例11:由函数返回一个引用
复制内容到剪贴板
代码:
<?php
function &returns_reference()
{
   return $someref;
}

$newref =& returns_reference();
?>
四. 变量函数
PHP 支持变量函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找 与变量的值相同的函数,并且将尝试执行它。除了别的事情以外,这个可以被 用于实现回调函数,函数表等等。

变量函数不能用于语言结构,例如 echo()、print()、unset()、isset()、empty()、include()、require() 以及类似的语句。您需要使用您自己的外壳函数来将这些结构用作变量函数。

例12:变量函数示例
复制内容到剪贴板
代码:
<?php
function foo()
{
   echo "In foo()
\n";
}

function bar($arg = '')
{
   echo "In bar(); argument was '$arg'.
\n";
}

// This is a wrapper function around 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()
?>
您还可以利用变量函数的特性来调用一个对象的方法。

例13:变量方法范例
复制内容到剪贴板
代码:
<?php
class Foo
{
   function Var()
   {
       $name = 'Bar';
       $this->$name(); // This calls the Bar() method
   }

   function Bar()
   {
       echo "This is Bar";
   }
}

$foo = new Foo();
$funcname = "Var";
$foo->$funcname();  // This calls $foo->Var()

?>

TOP

沙发
声誉好得令人发指,人格闪亮得让人嫉妒!

TOP

很详细啊~~报名来了啊~~,阳关----
  我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉。
+++++++++++++++++++++++++++++++++++
    没有人值得你流泪,值得让你这么做的人不会让你哭泣。

TOP

报名。报名

阳光把名字都打错了

课后总结:这节课迟到了。所以是从函数的变量开始听的。
1.函数的全局变量和局部变量的区别。
2.可变长度参数的函数。这个有待自己去查资料
3.用变量调用函数    可用于  计划任务
  e.g <?php
     function foo()
     {
       echo "In foo()";
     }
      $func = 'foo';
      $func();        // This calls foo()
        ?>
计划任务的实现思想:把要执行的函数全部放到一个数组,如果要增加某功能,修改下变量即可。
            如何放到数组。以下为示例:
       比如1点论坛要执行以下几个更新程序

        更新在线人数 updateMembers()
        更新帖子数 updatePosts()
       更新主题数 updateThreads();

        $updateMembers = 'updateMembers';
       $updatePosts = 'updatePosts';
      $updateThreads = 'updateThreads';

      $result = array($updateMembers,$updatePosts,$updateThreads); //则执行这个数组即可。
  计划任务如何实现。有待自己研究。

[ 本帖最后由 xm1822 于 2008-1-4 22:19 编辑 ]

TOP

报名,什么时候开讲!!!!!!我独善其身。

TOP

我来报名了

等了好久终于等到今天,我来了!每天都关注,终于等来了

TOP

我来报名了

对不起刚才忘了把群名写上
我是CNPHPERS.COM培训班群的  群号417987
谢谢战神Mars

TOP

来了 来啦   。。。。。。。。。。。。。。。。

TOP

````````听课________

网站爱好者群kllj................

TOP

在哪听课

在哪听啊快啊急死我了

TOP

回楼上的。就在群里讲

TOP

报名,我报名
安安 要报名

TOP

报名参加战神的讲课。

TOP

报名……
少之时,血气未定,戒之在色

TOP

不错啊
报名

TOP

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

$newref =& returns_reference();
?>
关于这样的应用,可以讲解具体的实例吗?我不是很理解。

TOP

引用:
原帖由 xm1822 于 2008-1-3 16:13 发表
报名。报名

阳光把名字都打错了

课后总结:这节课迟到了。所以是从函数的变量开始听的。
1.函数的全局变量和局部变量的区别。
2.可变长度参数的函数。这个有待自己去查资料
3.用变量调用函数    可用于  计划任务
这个计划任务仅仅是一个例子,计划任务只是一个概念,不要想的太复杂。
你定时去更新一个小程序,也是计划任务。
定时就是判断一下是否时间到了,到就就触发计划任务执行一段程序,就那么简单。
至于这段程序复杂程度,具体情况而定了

TOP

引用:
原帖由 战斧 于 2008-1-5 01:16 发表


关于这样的应用,可以讲解具体的实例吗?我不是很理解。
function &foo(){
   // do something
   $a =& new someclass();
   return $a;
}
$refa =& foo();
        
   这里函数foo中创建了一个对象,$a 就是这个对象的引用,函数返回的是这个引用。我们想在函数外部使用这个对象,就需要使用这样的方法,$refa =& foo(); 这一句话将函数foo返回的引用绑定到变量就是说$refa和foo内部的$a指向同一个内容。
    注意这里在定义函数和调用函数的地方都要有&符号。

TOP

谢谢Mars的解答。

TOP

真的辛苦了

这几天我搬家,网也上不了,没能及时看

寻找真诚

TOP

 21 12
发新话题