從零開始攻略PHP(6)——代碼重用與函數編寫的一些注意事項

bvmg9024 8年前發布 | 38K 次閱讀 PHP HTML PHP開發

一個新的項目是這樣創建的:它將已有的可重新利用的組件進行組合,并將新的開發難度降低到最小。

代碼重用的好處:降低成本、提升可靠性和一致性。

1.使用require()和include()函數

使用一條require()或include()語句,可以將一個文件載入到PHP腳本中。

require()和include()幾乎相同。區別是函數失敗后,require()函數將給出一個報錯。Include()給的則是警告。

變體函數分別是require_once()和include_once()。作用是確保一個包含(inlcuded)的文件只能被引入一次。當使用require()和include()來引入函數庫時,使用這兩個函數可以防止錯誤的引入同樣的函數庫兩次。

1.1 文件擴展名和require()函數

當使用require()語句時,必須注意處理文件擴展名和PHP標記的不同方式。將被包含文件保存在文檔樹之外,或使用標準的文件擴展名是非常重要的。

將文件中的PHP代碼放到PHP標記之間,能夠被當成PHP代碼進行處理。如果不使用PHP標記,將會被視為文本或者HTML腳本,因此也就不會被執行。

1.2 使用require()制作Web站點的模板

一個虛構的TLA咨詢公司:

原腳本home.html:

<html>
<head>
  <title>TLA Consulting Pty Ltd</title>
  <style type="text/css">
    h1 {color:white; font-size:24pt; text-align:center;
        font-family:arial,sans-serif}
    .menu {color:white; font-size:12pt; text-align:center;
           font-family:arial,sans-serif; font-weight:bold}
    td {background:black}
    p {color:black; font-size:12pt; text-align:justify;
       font-family:arial,sans-serif}
    p.foot {color:white; font-size:9pt; text-align:center;
            font-family:arial,sans-serif; font-weight:bold}
    a:link,a:visited,a:active {color:white}
  </style>
</head>
<body>

  <!-- page header -->
  <table width="100%" cellpadding="12" cellspacing="0" border="0">
  <tr bgcolor="black">
    <td align="left"><img src="logo.gif" alt="TLA logo" height="70" width="70" /></td>
    <td>
        <h1>TLA Consulting</h1>
    </td>
    <td align="right"><img src="logo.gif" alt="TLA logo" height="70" width="70" /></td>
  </tr>
  </table>

  <!-- menu -->
  <table width="100%" bgcolor="white" cellpadding="4" cellspacing="4">
  <tr >
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" /> 
      <span class="menu">Home</span></td>
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" />  
      <span class="menu">Contact</span></td>
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" /> 
      <span class="menu">Services</span></td>
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" /> 
      <span class="menu">Site Map</span></td>
  </tr>
  </table>

  <!-- page content -->
  <p>Welcome to the home of TLA Consulting.
  Please take some time to get to know us.</p>
  <p>We specialize in serving your business needs
  and hope to hear from you soon.</p>

  <!-- page footer -->
  <table width="100%" bgcolor="black" cellpadding="12" border="0">
  <tr>
    <td>
      <p class="foot">? TLA Consulting Pty Ltd.</p>
      <p class="foot">Please see our 
        <a href="legal.php">legal information page</a></p>
    </td>
  </tr>
  </table>
</body>
</html>

可以將這個文件分割,然后給這些部分分別命名為header.php、home.php和footer.php。文件header.php和footer.php都包含有在其他頁面中可以重用的代碼。

文件home.php代替home.html,它包含頁面內容和兩個require()語句:

<?php
  require('header.php');
?>
  <!-- page content -->
  <p>Welcome to the home of TLA Consulting.
  Please take some time to get to know us.</p>
  <p>We specialize in serving your business needs
  and hope to hear from you soon.</p>
<?php
  require('footer.php');
?>

可以將.inc(此處inc代表include)文件保存在一個目錄中,而這個目錄可以被腳本訪問,但是被引入的文件不會被Web服務器載入 。這種設置可以防止下面兩種情況發生:a)如果文件擴展名是.php,但只包含部分頁面或腳本,此時可能會引起錯誤。b)如果已經使用了其他擴展名,別人就可以讀取源碼。

所有TLA網站頁面可重復使用的頁眉header.php:

<html>
<head>
  <title>TLA Consulting Pty Ltd</title>
  <style type="text/css">
    h1 {color:white; font-size:24pt; text-align:center;
        font-family:arial,sans-serif}
    .menu {color:white; font-size:12pt; text-align:center;
           font-family:arial,sans-serif; font-weight:bold}
    td {background:black}
    p {color:black; font-size:12pt; text-align:justify;
       font-family:arial,sans-serif}
    p.foot {color:white; font-size:9pt; text-align:center;
            font-family:arial,sans-serif; font-weight:bold}
    a:link,a:visited,a:active {color:white}
  </style>
</head>
<body>

  <!-- page header -->
  <table width="100%" cellpadding="12" cellspacing="0" border="0">
  <tr bgcolor="black">
    <td align="left"><img src="logo.gif" alt="TLA logo" height="70" width="70"></td>
    <td>
        <h1>TLA Consulting</h1>
    </td>
    <td align="right"><img src="logo.gif" alt="TLA logo" height="70" width="70" /></td>
  </tr>
  </table>

  <!-- menu -->
  <table width="100%" bgcolor="white" cellpadding="4" cellspacing="4">
  <tr >
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" />
      <span class="menu">Home</span></td>
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" />
      <span class="menu">Contact</span></td>
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" />
      <span class="menu">Services</span></td>
    <td width="25%">
      <img src="s-logo.gif" alt="" height="20" width="20" />
      <span class="menu">Site Map</span></td>
  </tr>
  </table>

文件footer.inc包含了在每個頁面底部腳注處顯示的表格:

<!-- page footer -->
  <table width="100%" bgcolor="black" cellpadding="12" border="0">
  <tr>
    <td>
      <p class="foot">? TLA Consulting Pty Ltd.</p>
      <p class="foot">Please see our <a href="legal.php">
      legal information page</a></p>
    </td>
  </tr>
  </table>
</body>
</html>

如果希望保證一個文件將被當作純文本或HTML,并且不會執行任何PHP,可以使用readfile()作為替代方法。這個函數將回顯文件內容,不會對其進行解析。如果使用的是用戶提供的文本,這可能就是一個重要的安全問題。

1.3 使用auto_prepend_file和auto_append_file

如果希望使用require()將頁眉和腳注加入到每個頁面中,還可以設置php.ini中的auto_prepend_file和auto_append_file。使用這些指令包含的文件可以像使用include()語句包含的文件一樣;如果文件不存在,將產生一個警告。

Windows的設置如下:

auto_prepend_file = “c:/Program Files/Apache Software/Froundation/Apache2.2//include/header.php”

auto_append_file = “c:/Program Files/Apache Group/Apache2/Include/footer.php”

使用了這些指令,就不需要再輸入include()語句,但頁眉和腳注在頁面中不再是頁面的可選內容。

如果使用的是Apache Web服務器,可以對單個目錄進行不同配置選項的修改。這樣做的前提是服務器允許重設其主配置文件。要給目錄設定自動前加入和自動追加,需要在該目錄中創建一個名為.htaccess的文件。這個文件需要包含如下代碼:

php_value auto_prepend_file “/home/username/include/header.php”

php_value auto_append_file “/home/username/include/footer.php”

注意,其語法與配置文件php.ini中的相應選項有所不同,和行開始處的php_value一樣:沒有等號。許多php.ini中的配置設定也可以按這種方法進行修改。

在.htaccess中設置選項,而不是php.ini中或是在Web服務器的配置文件中進行配置,將帶來極大的靈活性。可以在一臺只影響你的目錄的共享機器上進行。不需要重新啟動服務器而且不需要管理員權限。使用.htaccess方法的一個缺點就是目錄中每個被讀取和被解析的文件每次都要進行處理,而不是只在啟動時處理一次,所以性能會有所降低。

2.函數編寫的一些注意事項

· 函數調用將不區分大小寫,變量名是區分大小寫的,所以$Name和$name是兩個不同的變量,但Name()和name()則是同一個函數。

· 如果希望在一個函數中退出PHP并輸入HTML腳本,可以像在腳本其他地方做的那樣——使用一個封閉的PHP標記,然后再編寫HTML。

· 許多語言允許重復使用函數名稱。這個特性叫做函數的重載。但是 PHP不支持函數重載 ,所以自定義函數不能和內置函數或是用戶已定義的函數重名。請注意,雖然每個PHP腳本知道所有內置函數,但對于用戶定義的函數,PHP只能識別哪些存在于腳本之中的。這就意味著,雖然可以在不同的文件中重復使用一個函數名,但這會引起混亂,所以應該避免。

· 通過3個幫助器函數:func_num_args()、func_get_arg()和func_get_args(),可以確定已經傳遞了多少個參數以及這些參數的值:

function var_args(){

        echo "Number of parameters:";

        echo func_num_args();



        echo "<br />";

        $args = func_get_args();

        foreach($args as $arg){

                echo $arg."<br />";

        }

}

var_args(2,123,234,122,7);

其中func_num_args()函數將返回傳入的參數個數。而func_get_args()函數將返回參數的數組。或者可以使用func_get_arg()函數一次獲得一個參數,該函數需要以希望訪問的參數個數作為參數(參數從0開始)。

3.關于作用域

PHP變量的作用域具有相當簡單的規則:

· 在函數內部生命的變量作用域是從聲明它們的那條語句開始到函數末尾。這些變量稱為局部變量。

· 在函數外部聲明的變量作用域是從聲明它們的那條語句開始到文件末尾。這叫做全局作用域。這些變量稱為全局變量。

· 特殊的超級全局變量在函數內部和外部都是可見的。

· 使用require()和include()并不影響作用域。如果這兩個語句用于函數內部,函數作用域適用。如果它不在函數內部,全局作用域適用。

· 關鍵字“global”可以用來手動指定一個在函數中定義或使用的變量具有全局作用域。

· 通過調用unset($variable_name)可以手動刪除變量。如果變量被刪除,它就不在參數所指定的作用域中了。

4.參數的引用傳遞和值傳遞

通常,函數獲取參數的方式是值傳遞。更好的辦法是使用引用傳遞。這里,在參數被傳遞給函數的時候,函數不會再創建一個新的變量,而是函數獲得一個原來變量的引用。這個引用有一個變量名稱,它以美元符號開始,可以像另一個變量那樣使用它。其區別在于 它不是獲得變量本身的值,而是指向原來的值。任何對該引用的修改都會影響到原始變量值 。

可以通過在函數定義的參數名前加一個地址符(&)來指定參數的引用傳遞。在函數調用處不用修改。

function increment(&$value, $amount = 1){

        $value = $value + $amount;

}

$a = 10;

echo $a.'<br />';

increment ($a);

echo $a.'<br />';

5.使用Return關鍵字

關鍵字“return”將終止函數的執行。

一個錯誤條件是在程序執行到函數末尾之前使用“return”語句中斷函數執行的最常見原因。

另一個重要作用是從函數返回一個值。

如果不符合判斷條件,可以返回“false”。(使用這種方法唯一需要注意的是編程人員調用這個函數必須使用“===”測試返回類型,確保“false”不會與0混淆。前一篇中有判斷代碼。)

6.關于遞歸

PHP支持遞歸函數。遞歸函數就是函數調用自己本身。 遞歸函數比循環慢而且要占用更多內存,所以應該盡可能多用些循環 。

兩種方式顛倒字符串:

<?php

function reverse_r($str)
{
   if (strlen($str)>0)
     reverse_r(substr($str, 1));
   echo substr($str, 0, 1);
   return;
}

function reverse_i($str)
{
   for ($i=1; $i<=strlen($str); $i++)
   {
     echo substr($str, -$i, 1);
   }
   return;
}

reverse_r('Hello');
echo '<br />';
reverse_i('Hello');

?>

遞歸的缺陷:

遞歸函數將在內存中創建幾個自身的副本,并且將產生多次函數調用的開銷。

當遞歸方法的代碼比循環方法的代碼更簡短、更美觀的時候,我們可能會選擇使用遞歸,但是在應用領域通常不會這樣。

另外,雖然遞歸看上去更美觀,但如果忘記給出遞歸的終止條件,這意味著函數會一直重復下去直到服務器內存耗盡,或者達到了最大調用次數。

7.名稱空間

名稱空間是一個抽象的容器,它可以包含一組標識符;在PHP中,名稱空間可以包含你所定義的函數,常量以及類。優點如下:

· 一個名稱空間中的所有函數、類和常量都將自動冠以名稱空間前綴。

· 非全路徑的類、函數和常量名稱將在運行時解析,在查看全局空間之前,將首先查看名稱空間。

整理自《PHP和MySQL Web開發》

 

來自:http://www.cnblogs.com/xulei1992/p/5787041.html

 

Save

 本文由用戶 bvmg9024 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!