首頁 > php教程 > php手册 > PHP5權威程式設計閱讀學習筆記 附電子書下載_php基礎

PHP5權威程式設計閱讀學習筆記 附電子書下載_php基礎

WBOY
發布: 2016-05-16 09:00:26
原創
2174 人瀏覽過

PHP 5 權威程式設計(PHP 5 Power Programming) PDF下載位址/books/28207.html 

PHP4中,不使用__construct()作為建構子的名字,必須使用類別的名字定義一個方法,就像在C 中一樣。
PHP5中,使用新的統一的建構子命名方式:__construct(),當然,使用類別名稱同樣也是可以的。
但是,你如果兩個同時使用的話,系統預設會使用__construct()的形式。

複製程式碼 程式碼如下:

class Person{
//PHP4中的方法
public function Person(){
echo "PHP4中的方法";
}
//PHP5建議使用的方法
public function __construct(){
echo "PHP5建議使用的方法";
}
public function say(){
}
}
$p1=new Person();
?>

在建構函式中不能回傳值,所以從建構函式內產生一個錯誤最常用的做法就是拋出一個例外。
程式碼如下:
複製程式碼 程式碼如下:

class Person{
private $_age;
public function __construct($age){
try {
if ($age$this->_age=$age;
}else {
throw new Exception("您輸入的年齡過大");
}
}catch (Exception $e){
echo $e->getMessage();
}
}
}
$p1=new Person(121);
?>

存取控制
物件屬性的存取保護是OOP的關鍵範例
Public:可以在任何地方被存取
Protected:類別成員可以被其所在類別的子類別和父類別從物件內部的方法存取
Private:類別成員只能被其所在類別從物件內部的方法訪問,而無法從繼承類別的成員中存取。因為私人成員不會被繼承,所以兩個相關的類別完全可以分別宣告一個名字相同的私有變數。
也就是兩個類別都只能看到自己的私有屬性,私有成員之間是沒有關係的。
範例:
複製程式碼 程式碼如下:

/**
* Define MyClass
*/
class MyClass
{
public $ public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public; echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; //這行能被正常執行
echo $obj->protected; // 這行會產生一個致命錯誤
echo $obj->private; // 這行也會產生一個致命錯誤
$obj ->printHello(); // 輸出Public、Protected 和Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以對public和protected 進行重定義,但private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this-> protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj->public; // 這行能正常執行echo $obj2->private; // 未定義private
echo $obj2->protected; // 這行會產生一個致命錯誤
$obj2->printHello(); // 輸出Public、Protected2 ,但不會輸出Private

注意:類別中的方法都必須使用關鍵字public、protected 或private 進行定義。如果沒有設定這些關鍵字,則該方法會被設定成預設的 public。
靜態方法
靜態方法可以不建立物件實例就透過類別名稱::靜態方法來調用,也可以在一個物件實例中透過$this->靜態方法或self: :靜態方法來呼叫。
複製程式碼 程式碼如下:

class Foo
{
public static $my_static = 'foo';
public static function staticValue() {
return self::$my_static;//在類別中存取靜態成員使用self關鍵字
} }
$obj=new Foo();
echo $obj->staticValue();//方式一
echo Foo::staticValue();//方式二
?>

克隆物件
在PHP4中,new一個物件的時候,回傳的是「物件本身」
在PHP5中,new一個物件的時候,回傳的是「指向物件的句柄」
這意味著在PHP5中,將物件實例($obj1)賦值給另一個變數($obj2)的時候,兩個物件都是指向同一塊記憶體區域。
例如:
複製程式碼 程式碼如下:

class test{
public $str;
}
$obj1=new test();
$obj1->str="obj1";
$obj2= $obj1;
$obj2->str="obj2";
echo $obj1->str;//將輸出「obj1」
?>

由於$obj1和$obj2指向的是同一塊記憶體區域,因此使用任何一個物件修改其中的成員變數的值的時候,都會影響到另一個物件。
但是在有些時候,我們確實需要複製一個物件的拷貝(兩塊相互獨立的記憶體區域),這時候可以使用語言命令clone
參考下面的例子;
複製程式碼 程式碼如下:

class test{
public $str;
}
$obj1=new test();
$obj1->str="obj1";
$obj2= clone $obj1;
$obj2->str="obj2";
echo $obj1->str;//將輸出「obj2」
?>

parent::和self::
self::指向目前類,而且通常用來存取靜態成員,方法和常數
parent::指向父類,而且它經常被用來呼叫父類的建構子和方法,也可以用來存取父類的成員和常數
注意:你應該使用parent::而不是父類的某個具體的名字,因為這樣可以令你方便的更改你的類別的層次。
範例:
複製程式碼 程式碼如下:

class Father{
public function __construct(){
echo "呼叫父類別的建構子
";
}
}
class Son extends Father {
public function __construct (){
parent::__construct();//方式一
// Father::__construct();//方式二
echo "呼叫子類別的建構子";
}
}
$son=new Son();
?>

結果:
呼叫父類別的建構子
呼叫子類別的建構子
推薦使用方式一,原因上面已經說了。
instanceof實例
複製程式碼 程式碼如下:

class Rectangle {
public $name=__CLASS__;
}
class Square extends Rectangle {
public $name=__CLASS__;
}
class Circle{
public $name=__CLASS__;
}
function checkIfRectangle($shape){
if ($shape instanceof Rectangle ){
echo $shape->name;
}else {
echo "該物件不是Rectangle類別的實例";
}
}
checkIfRectangle(new Square());//輸出:Square
checkIfRectangle(new Circle());/ /輸出:該物件不是Rectangle類別的實例
?>

註:__CLASS__是一個特殊的常數,用來儲存目前類別的名字
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板