第五章 代碼重用與函數編寫
require()或include()可以將一個檔案載入到php指令碼中。
這兩個函數幾乎等價,唯一的區別是調用失敗後require()給出一個致命錯誤,而include()只給出一個警告。
如果Web頁面具有一致的外觀,可以將相同的部分分離到單獨的頁面中,然後可以在php中使用require()語句將模板元素加入到頁面中。
如果希望保證一個檔案將被當作普通文本或html,而不執行任何php,可以使用readfile()作為替代方法。
require_once()和include_once()可以保證某個檔案只被包含一次,在使用函數庫的時候,這兩個函數非常有用,可以防止意外地多次包含相同的函數庫,從而導致函數的重複定義併產生錯誤。
也可以在php.ini設定檔中,使用auto_prepend_file和auto_append_file這兩個選項來設定頁首和頁尾,可以保證它們在每個頁面的前後被載入。此時就可以不再用include()語句。
auto_prepend_file = "/home/***/header.inc"
如果使用的apache,則可以給每個目錄單獨設定,在目錄中建立名為.htaccess的檔案,並在檔案中包含如下的代碼:
php_value auto_prepend_file "/home/***/header.inc"
(php的很多其它選項也可以通過這種方法來設定)
函式宣告方法:
function my_function()
{ echo 'myfunction'; }
函數調用不區分大小寫。function_name()等價於FunCtion_NaMe()。
php中函數定義不能和已有的函數重名,即不支援函數的重載。但可以包含預設的參數。
php中也可以聲明能夠接收可變參數數量的函數,通過如下三個函數:
func_num_args()、func_get_arg()以及func_get_args()。
function var_args()
{
echo "Number of parameters:";
echo func_num_args();
$args = func_get_args();
foreach($args as $arg)
echo $arg.'<br />';
}
php具有超級全域變數,在任何地方可見。
使用require()和include()並不影響範圍,被包含的全域範圍變數仍然可用。
關鍵字"global"可以用來手動指定在一個函數中定義或使用的變數具有全域範圍。
unset($var)可以手動刪除變數,在此之後就不能再使用了。
php函數參數也有“值傳遞”和“引用”傳遞。
function increment(&$value, $amount = 1){}
$value就是引用傳遞,$amount就是值傳遞。
return可以退出函數的執行。 也可以用return來從函數中返回一個值。
function larger($x, $y){
if ($x >= $y) return $x;
else return $y;
}
php支援遞迴函式。
第六章 物件導向的php
一個基本的php類:
class classname
{
function __construct($param) //建構函式
{
echo "Constructor called with parameter $param <br />";
}
function __destruct() //解構函式
{
echo "Destruct";
}
function operation($att){ //普通成員函數
$this->attribute = $att;
}
var $attribute; //普通成員變數
//取類屬性的值,可以通過__get和__Set函數
function __get($name) //$name參數指定屬性的名稱,在這個類裡面應該是$attribute
{
return $this->$name;
}
function __set($name, $value) //$value是被設定的值
{
this->$name = $value;
}
}
使用如下:
$a = new classname();
$a->$attribute = 5; //這句話,會間接的調用__set()函數
$a->$attribute; //會間接調用__get()函數
通過__get()、__set()是為了提供使其只有一個訪問入口,這樣就可以實現對要存取的資料進行檢查,保證資料是有意義的。
在php5中也引用了存取修飾詞,可以使用private和public及protected關鍵字控制訪問。
預設的存取修飾詞是public。
class classname
{
public $attribute;
public function __get($name){/**/}
}
實現繼承:
class A{
var $attr1;
function oper1(){}
}
class B extends A{
var $attr2;
function oper2(){}
}
B的對象也可以訪問$attr1和oper1();
在繼承中,通過使用private和protected來控制可見度。
如果A的oper1()是private的,則在B中無法訪問。protected和public都可以(與C++一樣)
php中的"重載“其實就是C++中的覆蓋,子類函數名與父類函數名相同,且將父類的同名函數隱藏掉。
php5中引入的final關鍵字可以禁止繼承和重載。
class A{
final function opera(){}
}
則opera()函數在子類中不能被重載。
php不支援多重繼承,不過支援介面。
interface Displayable
{
function display();
}
class WebPage implements Displayable
{
function display(){ /*實現代碼*/ }
}
在業務繁忙的網站中,處理速度是很重要的,應該盡量使用靜態html網頁,或者儘可能緩衝指令碼輸出,從而減少在伺服器上的載入操作。
在php4中,對象是按值傳遞的,但在php5中是按引用傳遞的。
以前的php版本無法間接引用由函數返回的對象,如:select()->display();
php5中引用了Per-Class常量,可以在不需要初始化類的情況下使用。
class Math {
const pi = 3.14;
}
可以直接這樣使用 Math::pi。
php5也引入了static關鍵字,它允許在未初始化類的情況下,就可以調用的類方法。(在靜態方法中不能使用this關鍵字)
php5提供了instanceof關鍵字和類型提示的概念。
php5引入了clone關鍵字,允許複製一個已有的對象。 $c = clone $b;
在基類中建立__clone()方法,可以自訂複製行為,而不使用預設的。
php5中也引入了“抽象類別”和“抽象方法”。
包含抽象方法的任何類自身都必須是抽象的。
abstract class A {
abstract function operationX($param);
}
重載__call()方法,可以實現方法的重載。
public function __call($method, $p)
{
if ($method == 'display') {if (...) else if (...)}
}
可以實現在調用 display方法時,根據call的實現,調用不同的函數。
__autoload()方法,是一個單獨的函數,它用來執行個體化一個還沒有被聲明的類時自動載入"類名.php"檔案。
代器和迭代
可以使用foreach()方法通過迴圈方式取出一個對象的所有屬性,就像數組方式一樣。(引擎會預設產生)
但如果需要更複雜的功能的話,則只能通過實現一個迭代器的方式。
__toString()函數可以將類轉換成字串,echo類時,會顯示相應的字串。
反射API:
$varcls = new ReflectionClass('Page'); //Page是個類名
echo $varcls; //就可以列印出Page類的資訊
第七章 異常處理
PHP中,異常必須手動拋出。
throw 異常類;
如可以拋出內建的Exception類:throw new Exception('message', code);
在外部用catch來捕獲。
Exception類提供了很多內建方法:
getCode()--返回傳遞給建構函式的代碼。
getMessage()--返回傳遞給建構函式的訊息。
getFile()--返回產生異常的代碼檔案的完整路徑。
getLine()、getTrace()、getTraceAsString()、_toString等等……
也可以拋出自訂的任何類對象,不過一般情況下都會使自訂的異常類從Exception中繼承。