泷涯吧 关注:36贴子:2,044
  • 7回复贴,共1

【php教程】函数基础篇

只看楼主收藏回复

嗯啊,废话不多说
※※※※※※※※※※※※※※※※※※※※※※※※
函数是一个程序的核心,先来看下面一段代码(教程的示例代码都不考虑注入,但是实际应用请优先考虑安全问题!)
$id=$_GET['id'];
$result=mysql_query("SELECT * FROM `{$dbprefix}article` WHERE id='$id'"); //其中$dbprefix是数据表前缀
if ($result===FALSE) exit('数据库查询失败,错误信息:'.mysql_error());
这段代码里,执行的是一个数据库查询的过程。一个程序中,需要的查询会有很多处,如果每一处都写这样一段代码,不仅难维护,也不美观。比如php5.5不再支持MySQL,我要把mysql函数都换成mysqli,每处都弄一次相当麻烦,也容易漏掉。这里,我们就要用到函数了


IP属地:浙江来自手机贴吧1楼2014-02-02 12:11回复
    定义一个函数的方法:
    function 函数名 (参数1,参数2, … 参数N) {
    处理过程
    }
    函数名必须以英文字母或者“_”开头,函数名不能有除数字、英文、“_”(下划线)以外的字符。参数当然可以有很多个,也可以没有。例如,上面的查询过程可以写成一个函数
    function getarticle ($id) {
    global $dbprefix; //接下来解释
    $result=mysql_query("SELECT * FROM `{$dbprefix}article` WHERE id='$id'"); //其中$dbprefix是数据表前缀
    if ($result===FALSE) exit('数据库查询失败,错误信息:'.mysql_error());
    return $result; //返回结果
    }


    IP属地:浙江来自手机贴吧3楼2014-02-02 12:18
    回复
      有的时候,我们希望某个参数是可选的。如果传入了,就使用传入的。如果没有传入,就使用默认的。比如,上例中,我们希望$dbprefix是可以由用户传入的
      function getarticle ($id,$dbprefix='') {
      if (empty($dbprefix)) $dbprefix=$GLOBALS['dbprefix']; //$GLOBALS接下来解释
      $result=mysql_query("SELECT * FROM `{$dbprefix}article` WHERE id='$id'"); //其中$dbprefix是数据表前缀
      if ($result===FALSE) exit('数据库查询失败,错误信息:'.mysql_error());
      return $result; //返回结果
      }
      仔细观察,可以发现定义参数的时候,规定了$dbprefix='',这个意思是,如果没有传入$dbprefix(例如这样调用函数:getarticle($id)),则$dbprefix为空,否则则为传入的(例如这样调用这个函数:getarticle($id,'aaa'))。当然,通过更改''我们可以改变默认值,例如:function getarticle ($id,$dbprefix='sy_'),则默认值是sy_


      IP属地:浙江来自手机贴吧4楼2014-02-02 12:26
      回复
        函数中使用的变量,默认都是局部变量(什么是局部变量?参见《php基础教程二.php变量》),如果要使用全局变量,有两个方法
        方法一.使用global这个特殊函数
        例如:
        $a='abc';
        function outa () {
        echo $a;
        }
        outa();
        这样会产生一个Notice错误,因为函数调用了一个不存在的变量,而不会输出abc


        IP属地:浙江来自手机贴吧5楼2014-02-02 12:33
        回复
          现在改改
          $a='abc';
          function outa () {
          global $a;
          echo $a;
          }
          outa();
          这样,就可以输出abc了
          如果需要调用多个全局变量,可以这样:
          $a='aaa';
          $b='bbb';
          function outa () {
          global $a,$b; //用逗号隔开
          echo $a,$b;
          }
          outa();
          会输出aaabbb
          方法二.使用超全局变量$GLOBALS
          还是这个例子
          $a='abc';
          function outa () {
          echo $GLOBALS['a'];
          }
          outa();
          嗯?是不是没有报错,而且成功输出了abc?因为使用了$GLOBALS这个超全局变量,这个变量包括了所有全局变量,改变它,也相当于改变了相应的全局变量,例如:
          $a='abc';
          function outa () {
          $GLOBALS['a']='Hello php';
          }
          outa();
          echo $a; //输出Hello php
          global与$GLOBALS有什么区别?网上说,global不能修改全局变量的值,不过实际使用中,我没有遇到这个问题,觉得两者都一样,如果有错,还请大家指正~


          IP属地:浙江来自手机贴吧6楼2014-02-02 12:40
          回复
            注意!超全局变量不需要任何操作,就可以在函数内部使用!
            static详解
            php中的变量作用范围的另一个重要特性就是静态变量(static变量)。静态变量仅在函数中存在且只被初始化一次,当程序执行离开此函数时,其值不会消失。下次调用,会使用上次执行的结果。看看下面的实例:
            <?php
            function test() {
            $w3sky=0;
            echo $w3sky;
            $w3sky++;
            }
            ?>
            本函数每次调用时都会将 $w3sky的值设为0并输出 "0"。将变量加一的$w3sky++没有其到效果,因为一旦退出本函数则变量$w3sky就不存在了。要写一个不会丢失本次计数值的计数函数,要将变量$w3sky定义为静态(static)的:
            <?php
            function test() {
            static $w3sky=0;
            echo $w3sky;
            $w3sky++;
            }
            ?>
            本函数每调用test()都会输出$w3sky的值并加一。


            IP属地:浙江来自手机贴吧7楼2014-02-02 12:46
            回复
              函数返回:就一个函数return
              这个函数属于特殊函数,调用方法:return $a;
              注意!此方法只在函数中适用!
              返回会退出当前函数的运行,例如:
              function test() {
              echo 'a';
              return TRUE;
              echo 'b';
              }
              这个函数不会输出b,因为上面的return已经退出了本函数的运行


              IP属地:浙江来自手机贴吧8楼2014-02-02 12:50
              回复
                就写到这里,函数篇结束,待整理格式什么的


                IP属地:浙江来自手机贴吧9楼2014-02-02 12:51
                回复