php4中,不使用__construct()作為建構函式的名字,必須使用類的名字定義乙個方法,就像在c++中一樣。
php5中,使用新的統一的建構函式命名方式:__construct(),當然,使用類名同樣也是可以的。
但是,你如果兩個同時使用的話,系統缺省會使用__construct()的形式。
<?phpclass
person
//php5推薦使用的方法
public
function
__construct()
public
function
say()
}$p1=new
person();
?>
在建構函式中不能返回值,所以從建構函式內產生乙個錯誤最常用的做法就是丟擲乙個異常。
**如下:
<?phpclass
person
else
}catch (exception$e)}}
$p1=new person(121);
?>
訪問控制
物件屬性的訪問保護是oop的乙個關鍵範例
public:可以在任何地方被訪問
protected:類成員可以被其所在類的子類和父類從物件內部的方法訪問
也就是兩個類都只能看到自己的私有屬性,私有成員之間是沒有關係的。
例子:
<?php/*** define myclass */
class
myclass
}$obj = new
myclass();
echo
$obj->public; //
這行能被正常執行
echo
$obj->protected; //
這行會產生乙個致命錯誤
echo
$obj->private; //
這行也會產生乙個致命錯誤
$obj->printhello(); //
輸出 public、protected 和 private/**
* define myclass2 */
class myclass2 extends
myclass
}$obj2 = new
myclass2();
echo
$obj->public; //
這行能被正常執行
echo
$obj2->private; //
未定義 private
echo
$obj2->protected; //
這行會產生乙個致命錯誤
$obj2->printhello(); //
輸出 public、protected2,但不會輸出 private
注意:類中的方法都必須使用關鍵字public、protected 或 private 進行定義。如果沒有設定這些關鍵字,則該方法會被設定成預設的 public。
靜態方法
靜態方法可以不建立物件例項就通過 類名::靜態方法 來呼叫,也可以在乙個物件例項中通過$this->靜態方法或self::靜態方法來呼叫。
<?phpclass
foo}
$obj=new
foo();
echo
$obj->staticvalue();//
方式一echo foo::staticvalue();//
方式二?>
轉殖物件
在php4中,new乙個物件的時候,返回的是「物件本身」
在php5中,new乙個物件的時候,返回的是「指向物件的控制代碼」
這意味著在php5中,將物件例項($obj1)賦值給另乙個變數($obj2)的時候,兩個物件都是指向同一塊記憶體區域。
比如 :
<?phpclass
test
$obj1=new
test();
$obj1->str="obj1";
$obj2= $obj1
;
$obj2->str="obj2";
echo
$obj1->str;//
將輸出「obj1」
?>
由於$obj1和$obj2指向的是同一塊記憶體區域,因此使用任何乙個物件修改其中的成員變數的值的時候,都會影響到另乙個物件。
但是在有些時候,我們確實需要複製乙個物件的拷貝(兩塊相互獨立的記憶體區域),這時候可以使用語言命令clone
參考下面的例子;
<?phpclass
test
$obj1=new
test();
$obj1->str="obj1";
$obj2= clone
$obj1
;
$obj2->str="obj2";
echo
$obj1->str;//
將輸出「obj2」
?>
parent::和self::
self::指向當前類,而且通常用來訪問靜態成員,方法和常量
parent::指向父類,而且它經常被用來呼叫父類的建構函式和方法,也可以用來訪問父類的成員和常量
注意:你應該使用parent::而不是父類的某個具體的名字,因為這樣可以令你方便的更改你的類的層次。
例子:
<?phpclass
father
}class son extends
father
}$son=new
son();
?>
結果:呼叫父類的建構函式
呼叫子類的建構函式
推薦使用方式一,原因上面已經說了。
instanceof例項
<?php
classrectangle
class square extends
rectangle
class
circle
function checkifrectangle($shape
)else
}checkifrectangle(
new square());//
輸出:square
checkifrectangle(
new circle());//
輸出:該物件不是rectangle類的例項
?>
注:__class__是乙個特殊的常量,用來儲存當前類的名字
PHP5權威程式設計 學習筆記
php5權威程式設計 一 如何嵌入到html當中 print hello,world 執行的輸出 如果php有輸出 替換掉php 二 注釋 1 2 3 三 變數 陣列元素或物件的屬性 標誌當字首,以字母或下劃線開始。php不支援全域性變數。變數都被限制到本地範圍,而且如果是在函式中建立的,它們的生存...
php5 學習記錄 2
一 過載效能 1 屬性和方法的過載 php 允許通過實現特殊的 方法對屬性的訪問和方法的呼叫進行過載,這些 方法將在相關的屬性或者方法不存在時呼叫。這種特性讓你在中端這些動作並定義你自己的功能時獲得巨大的靈活性。你可以實現下面的方法原型 function get property 傳遞屬性的名字,並...
PHP5學習筆記 用 call 實現方法過載
今天在網上發現了一片好文章,介紹 call 方法。依靠這個方法可以實現方法過載,這是找了好久的東西了。發在這裡,算作筆記。php5 的物件新增了乙個專用方法 call 這個方法用來監視乙個物件中的其它方法。如果你試著呼叫乙個物件中不存在的方法,call 方法將會被自動呼叫。例七 call class...