PHP和MySQL开发—第五章の代码重用与函数编写

第五章 代码重用与函数编写

1.require()和include()函数

  • 二者几乎是相同的,唯一区别在于函数失败后,require()函数会给出一个致命的错误;而include()只是给出一个警告。
  • 通常来说,PHP语句放在HTML文件中时,它们是不会被处理的。
  • 但是如果通过require()和include()来载入html文件时,文件内的任何PHP命令就都会被处理了。
  • require_once()和include_once()函数:这两个函数是require()和include()函数的变体,是确保一个包含的文件只能被引入一次,使用这两个函数可以防止错误的引入同样的函数库两次。
    • require()和 inlude()函数运行速度更快。
  • 举例:可以将一个网页的首页简单分为头部,内容和底部来看,并分别编写它们的代码。
    • header.php代码如下

      <html>
          <head>
              <title>磕基的公募基金课程</title>
              <style type="text/css">
                  h1 {
                      color: rgb(153,0,0);
                      font-size: 24pt;
                      text-align: center;
                  }
                  .menu {
                      color: rgb(153,0,0);
                      font-size: 16pt;
                      text-align: center;
                      font-weight: bold;
                  }
                  td {background: #363636;}
                  p {
                      color: black;
                      font-size: 12pt;
                      text-align: justify;
                  }
                  p.foot{
                      color: white;
                      font-size: 9pt;
                      text-align: center;
                      font-weight: bold;
                  }
                  a:link,a:visited,a:active {color:white;}
                  
              </style>
              
          </head>
      <body>
          <!--页面头部-->
          <table width="100%" cellpadding="12" cellspacing="0" border="0">
              <tr bgcolor="black">
                  <td align="left">![](../images/logo.PNG)</td>
                  <td>
                      <h1>磕基</h1>
                  </td>
                  <td align="right">![](../images/logo.PNG)</td>
              </tr>
          </table>
          <!--菜单-->
          <table width="100%" bgcolor="white" cellpadding="4" cellspacing="4">
              <tr>
                  <td width="25%">
                      ![](../images/logo.PNG)
                      <span class="menu">主页</span>
                      
                  </td>
                  <td width="25%">
                      ![](../images/logo.PNG)
                      <span class="menu">课程</span>
                      
                  </td>
                  <td width="25%">
                      ![](../images/logo.PNG)
                      <span class="menu">在行</span>
                      
                  </td>
                  <td width="25%">
                      ![](../images/logo.PNG)
                      <span class="menu">公众号</span>
                      
                  </td>
              </tr>
          </table>
      
    • home.php主页内容部分代码如下

      <?php
          require_once('header.php');
      ?>
      <!--网页内容-->
      <p>欢迎来到磕基的页面,你可以画一些时间来了解我们</p>
      <p>我们提供最专业的公募基金理财课程</p>
      <?php
          require_once('footer.php'); 
      ?>
      
    • footer.php网页底部代码如下

      <!--页面底部-->
      <table width="100%" bgcolor="black" cellpadding="12" border="0">
          <tr>
              <td>
                  <p class="foot">&copy; 北京二叁叁文化传播有限责任公司</p>
                  <p class="foot">点击查看<a href="../feedback.html">更多内容</a></p>
              </td>
          </tr>
          
      </table>
      
    • 最终效果如图

2.函数

  • 调用未定义的函数
    • 如果调用的函数出错,PHP会报出一个错误信息。
      • 调用未定义函数出错
      • 遇到该类信息,对几个事情进行检查。

        • 函数名称的拼写是否正确;
        • 该函数是否存在于所用的PHP版本中;
        • 所调用的函数是PHP扩展的一部分,而该部分并没有被载入。
  • 函数名称是不区分大小写的;因此,命名函数的规则就是都用小写字母。
    • 变量名是区分大小写的,而函数名则不区分。
  • 函数的命名
    • 函数命名的限制
      • 函数名称不能和已有的函数重名;
      • 函数名称只能包含字母(a-zA-Z)、数字(0-9)和下划线(_);
      • 函数名称不能以数字开始
    • PHP不允许函数重载,所以用户自定义函数不能与PHP内置的函数或已定义的函数重名。
  • 使用参数
    • 参数允许将数据传给函数的。
    • 参数分为形参和实参
      • 所谓形参,全称为“形式参数”,其不是实际存在变量,所以也有的叫做虚拟参数;它主要是在定义函数名和函数体时所用到的参数,目的是用来接收调用该函数时传入的参数。
      • 而实参的全称顾名思义,则是“实际参数”,其是在调用传递函数的参数;这个参数可以是变量、常量、表达式或函数等,但要注意的是无论何种类型,都必须有确定的值。
      • 以下面代码为例:
    function create_table($data){
    echo "<table border="1">";
    reset($data);
    $value=current($data);
    while($value){
    echo"<tr><td>".$value."</td></tr>\n";
    $value=next($data);
    }
    echo "</table>";
    }
    $myArray=array('Line one','Line two','Line three.');
    create_table($myArray);
    
            - 这里面create_table(\$data)中的\$data就是形参,因为其并不是实际存在的变量。
            - 而最下面的create_table(\$myArray)中的\$myArray则是实参,因为$myArray包含的是一个数组,其具有实际值array('Line one','Line two','Line three.')。
    
  • 传参的时候如果有可选值,则不用全部给出,参数将会根据所给出的参数个数从左到右顺序进行赋值。
  • 不能漏掉一个可选参数而直接给参数列表中的最后一个参数赋值。

3.作用域

  • PHP作用域规则:
    • 函数作用域:在函数内部声明的变量作用域是从声明它们的那条语句开始到函数末尾,其变量被称为局部变量;
    • 全局作用域:在函数外部声明的变量作用域是从声明它们的那条语句开始直到文件末尾,其变量被称为全局变量;
    • 某些特殊的超级全局变量在函数内部和外部都是可见的。(如:$GLOBALS、$_SERVER、$_REQUEST等)
    • 使用require()和include()并不影响作用域。
      • 这两个语句如果用于函数内部,则适用函数作用域;
      • 如果用于函数外部,则适用全局作用域。
    • 关键字“global”可以用来手动制定一个在函数中定义或使用的变量具有全局作用域;
    • 删除某个变量可以使用unset($variable_name),该函数可以手动删除某个变量,删除之后,该变量就不在参数所指定的作用域中了。
  • 函数作用域和全局作用域的区别以如下代码为例:
    $i="lyangye";
    function fn(){
        echo '函数内部未声明全局变量的$i='.@$i."<br/>";
        global $i;
        echo '函数内部声明了全局变量的$i='.$i."<br/>";
        $var="content";
        echo '函数内部的局部变量$var='.$var."<br/>";
    }
    fn();
    echo '函数外部的$i='.$i."<br />";

-
最终效果如图
- 如果想要从函数外部引入全局变量,需要使用global命令来声明其后的变量是全局变量;否则的话PHP函数会认为该变量是个新的局部变量。
- 函数的作用域不同于变量的作用域

4.值传递与引用传递

  • 通常情况下,函数获取参数的方式是值传递。当传递一个参数的时候,所创建的新的变量($var_副本)可以看做是原变量($var)的副本(复制品);对于该复制品,可以对其进行任意的修改,而能够函数外部的变量值不改变。
  • 而当需要函数外的原变量($var)也跟着函数内的副本变量($var_副本)一起改变时,就需要是用引用传递;意思就是当修改了函数内的副本变量时($var_副本),函数外的原变量($var)也会跟着一起变化
  • 可以通过在函数定义的参数名前加一个地址符(&)来制定参数的引用传递。
  • 以下面代码为例:
    • 值传递:

      //值传递
          function maoPiao($value,$amount=1){
              $value=$value+$amount;
          }
          $value=10;
          maoPiao($value);
          echo $value;
      
      • 值传递$value效果
    • 引用传递

    //引用传递
    function maoPiao(&$value,$amount=1){
            $value=$value+$amount;
        }
        $value=10;
        maoPiao($value);
        echo $value;
    
引用传递$value效果
  • 所以引用传递可以用来做变量的增量运算。
    //引用传递
    function maoPiao(&$value,$amount=1){
        $value=$value+$amount;
    }
    $value=10;
    echo '调用maoPiao函数之前的$value='.$value."<br />";
    maoPiao($value);
    echo '调用maoPiao函数之后的$value='.$value."<br/>";
    
最终效果

5.return关键字

  • return的作用是终止函数的执行,在其下面的所有函数内代码都将被忽略。

    • 以下面代码为例:
        function testReturn(){
            echo "这个内容将会被打印";
            return;
            echo "这个内容不会被打印";
        }
        testReturn();
    
    • 输出效果
  • return的正确用法:

    • 满足特定条件之后终止函数。
    function larger($x,$y){
        if((!isset($x))||(!isset($y))){
            echo "输入的内容不符合规范,请重新输入";
            return;
        }
        if($x>=$y){
            echo $x."<br />";
        }else {
            echo $y."<br />";
        }
    }
    larger(2);
    
      - ![缺少一个参数输入的显示效果](http://upload-images.jianshu.io/upload_images/4167376-e2a5d7015827f953.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
      - 
      ```
      function larger($x,$y){
          if((!isset($x))||(!isset($y))){
              echo "输入的内容不符合规范,请重新输入";
              return;
          }
          if($x>=$y){
              echo $x."<br />";
          }else {
              echo $y."<br />";
          }
      }
      larger(2,10);
      ```
      - ![正确传入两个参数的显示效果](http://upload-images.jianshu.io/upload_images/4167376-252b102a21c5b593.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
  • 返回函数值

    • return也可以用来将函数的结果的值进行返回,便于其他代码的调用。

    • 用return返回值的话,上述代码可以修改为:

        ```
        function larger($x,$y){
                if((!isset($x))||(!isset($y))){
                    return flase;
                }
                if($x>=$y){
                    return $x;
                }else {
                    return $y;
                }
            }
            $a=5;
            $b=10;
            echo larger($a,$b);
        ```
      
      • 最终显示效果和上述代码一样
  • 递归函数
    • 所谓递归函数就是函数调用其自身;
    • 很多情况下,递归可以用来取代循环;
    • 递归函数比循环慢而且要占用更多内存,所以尽可能少用递归;
      • 这是因为递归在每次调用函数的时候都会在内存中生成一段该函数的新副本,相应的也将产生多次函数调用的开销。
    function reverseR($str){
    if(strlen($str)>0){
    reverseR(substr($str,1));
    }
    echo substr($str,0,1)."
    ";
    return;
    }
    reverseR('Hello');
    ```
    • 递归的显示效果

6.名称空间

  • 名称空间是一个抽象的容器,其可以包含用户所定义的函数,常量以及类。
  • 优点:
    1. 一个名称空间中的所有函数、类和常量都将自动冠以名称空间前缀;
    2. 非全路径的类、函数和常量名称将在运行时解析,在查看全局空间之前,将首先查看名称空间。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容