PHP學習筆記5:代碼重用和函數

讀《PHP和MySQL Web開發》筆記合集: php

http://my.oschina.net/bluefly/blog/478580 html


一、 代碼重用的好處
成本、可靠性、一致性
注意:只要原來的代碼是模塊化的並且編寫良好,那麼重複使用代碼還會節省不少工做。在工做時,能夠試着辨認一下從此可能再次要調用的代碼段。

二、 require() 與被包含代碼執行問題
若是但願一個被包含文件中的PHP代碼可以被當成PH代碼進行處理,必須將PHP代碼放到PHP標記之間(無論被包含代碼的文件是什麼後綴,jpg、rar後綴都無所謂,只要裏邊的php代碼是放在php標籤裏的,被包含後都能執行)
可是文件後綴,會影響瀏覽器訪問該文件時是否直接載入,並以普通文本的形式查看源代碼。
因此, 爲了安全,請將被包含文件保存在文檔樹以外,或者使用標準的文件擴展名

例子: windows


三、若是 被包含文件不存在的話, require會給一個致命錯誤,而include 只會給一個警告
還有兩個變體, require_once() ,include_once() 確保一個被包含的文件,只能被引入一次。
注意:當引入函數庫時,這兩個函數才很是有用,使用這兩個函數能夠防止錯誤的引入一樣的函數庫兩次,從而出現重複定義的錯誤。若是關心編碼實踐,能夠考慮使用require() 和include() ,由於它們的運行速度較快。




經過require()  調用外部文件的時候,文件的名稱並不會影響對它們的處理

四、即便php後綴的,文件,若是寫HTML代碼,直接訪問,仍是當作html被解析處理的

注意若是 但願保證一個文件被當作純文本或HTML,並且不會執行任何PHP ,可使用  readfile()  做爲替代方法。這個函數將回顯文件內容,不會對其進行解析。若是使用的是用戶提供的文本,這可能就是一個重要的安全問題。

五、一個好的靜態頁面模板
例子:
<html>
<head>
<style>
...
</style>
</head>
<body>
<!-- page header -->
...
<!-- menu -->
...
<!-- page content-->
....
<!-- page footer-->
...
</body>
</html>

六、但願將頁眉和腳註加入到每一個頁面中
1)配置 php.ini
auto_prepend_file
auto_append_file
windows例子以下
auto_prepend_file = 「c:/Program Files/Apache Software Froundation/Apache2.2/include/header.php」
auto_append_file = 「c:/Program Files/Apache Froup/Apache2/include/footer.php」
UNIX例子以下:
auto_prepend_file = 「/home/username/include/header.php」
auto_append_file  = 「/home/username/include/footer.php」
注意:若是使用了這些指令,就不須要再輸入include() 語句,但頁眉和頁腳在頁面中再也不是頁面的可選內容了
2)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.ini中的設定也能夠按照這種方法修改。
注意:在.htaccess 中設置選項,有極大的靈活性。能夠在一臺隻影響你的目錄的共享主機上進行,不須要重啓服務器,也不須要管理員全下。
缺點是,使用.htaccess 的目錄中每一個被讀取和被解析的文件每次都要進行處理,而不是隻在啓用時處理一次。

七、函數中可選參數的問題
首先注意,PHP裏函數名不區分大小寫,變量名區分,而JavaScript是都區分。

好比一個函數原型:
resource fopen( string  filename, string  mode [, bool  use_include_path [, resource  content]] )
詳細解釋:
"resource" 告訴咱們該函數會返回一個資源,fopen()函數中,函數原型中共給出了4個參數。[] 剛括號指明瞭這個參數是可選的,能夠忽略它們,若是忽略它們,它們會使用默認只。
請注意:一個具備多個可選值的函數,必須給可選參數從左到右賦值。好比,能夠不給出 content 參數,或者能夠不提供use_include_path 和 content 參數,可是不能不提供use_include_path ,而只給出content參數。

測試: 數組

例子2:注意了哈,還有一個說法是,說php只傳遞值。 瀏覽器

16依次賦給了第3個參數c。


八、調用未定義的函數

Fatal error: Call to undefined function tests1() in D:\wamp\www\study\fuc.php on line 10
注意:一般PHP給出的錯誤信息是很是有用的,它告訴咱們錯誤出如今哪一個文件中,哪一行,以及咱們調用的函數名稱。
若是看到這個信息,有3個可能
1)函數名稱的拼寫是否正確;
2)這個函數是否存在於全部的PHP版本中;
3)所調用的函數是不是PHP擴展的一部分,而該部分並無被載入。

九、函數的基本結構
1)函數命名有以下幾個限制
函數名稱不能喝已有函數重名(許多語言容許重複使用函數名稱,叫「重載」,PHP不支持函數重載);
函數名稱只能包含字母、數字和下劃線且不能以數字開始。

注意:
$name 並非一個函數的合法名稱,但相似於$name(); 的函數調用,也能夠正確地執行 ,這是根據$name 的值來肯定的。PHP能夠取出保存在$name 中的值,尋找具備那個名稱的函數,而且調用該函數。這種函數類型被稱爲 可變函數,並且有時候是有用的。

2)在{} 花括號中,能夠包含在PHP 腳本的其餘地方都合法的代碼,其中包括函數調用、新的變量或函數聲明、require()或include() 語句類聲明以及HTML代碼。
若是但願在一個函數中退出PHP 並輸入 HTML腳本,能夠像在腳本其餘地方作的那樣,使用一個風的PHP標記,而後再編寫HTML。例子:
<?php
 function my_function() {
?>
My function was called

<?php
 }
?>

十、 3個幫助器函數,肯定傳遞進來的參數狀況
func_num_args():返回傳入的參數個數
func_get_arg():一次得到一個參數
func_get_args():返回參數的數組


十一、理解做用域
1)函數內局部變量和函數外全局變量,能夠變量名相同,不衝突,懂。
2)有所謂的「超級全局變量」
3)global 可手動指定函數中的變量具備全局做用域。
4)調用 unset($variable_name) 能夠手動刪除變量,若是變量被刪除,它就再也不參數所指定的做用域中了。

例子: 安全

由於$var 並無被賦值。
建議:避免函數內外使用同一個變量名。


十二、參數的引用傳遞和值傳遞
值傳遞: 
function increment( $value, $amount = 1)
{...}
引用傳遞: 
function increment(& $value, $amount = 1)
{...}
引用傳遞,能改變原值。

1三、return
當一個函數的執行結束時,要麼是由於全部命令都執行完了,要麼就是使用了「return」,return能夠不返回值,可是建議返回。

1四、遞歸
PHP支持遞歸函數,遞歸函數就是函數調用本身自己。這些函數特別適用於瀏覽動態數據結構,例如鏈接列表和樹。
可是,幾乎沒有基於Web的應用程序要求使用如此負責的數據結構。在不少狀況下,遞歸能夠用來取代循環,由於兩者都是重複作一些事情。遞歸函數比循環慢並且要佔用更多內存,因此應該儘量多用些循環。
<?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');

?>

可是,如上邊的例子,遞歸那段,每次調用這個函數都在服務器的內存中生成一段該函數代碼的新副本,遞歸函數將在內存中建立幾個自身的副本,並且將產生屢次函數調用的開銷。
雖然遞歸看上去更美觀,但必定要給出終止條件,不然將致使服務器內存耗盡,或者達到了最大調用次數。

1五、命名空間 (又叫名稱空間,namespace)
一般,命名空間是一個抽象的容器,它能夠包含一組標識符;
PHP中,命名空間能夠包含你所定義的函數、常量和類。
從結構角度看,爲自定義函數和類定義命名空間的有點:
1)一個命名空間中的全部函數、類和常量都將冠以名稱空間前綴。
2)非全路徑的類、函數和常量名稱將在運行時解析,在查看全局空間以前,將首先查看命名空間。
相關文章
相關標籤/搜索