1 使用extends實現繼承以及重載、魔術方法的含義
class B extends A
聲明的時候B裡可以沒有A裡的方法
調用的時候$b=new B();
$b->A裡的方法();
$b->A裡的屬性=1;
$b->B裡的方法();
$b->B裡的方法();
如果$a=new A();
可以
$a->A裡的方法();
$a->A裡的屬性=1;
不可以
$a->B裡的方法();
$a->B裡的方法();
重載:B繼承A ,B裡實現和A同名的方法屬性。
PHP中的"重載"與其它絕大多數物件導向語言不同。傳統的"重載"是用於提供多個同名的 類方法,但各方法的參數類型和個數不同。
魔術方法:PHP把所有以__(兩個底線)開頭的類方法當成魔術方法。所以你定義自己的類方法時,不要以 __為首碼。
2 繼承用private和protected存取修飾詞可見度
屬性方法private不可以被繼承
屬性方法protected類外部不可見,可以被繼承
屬性方法public 所定義的類成員可以在任何地方被訪問
3 php中雙冒號::的應用
php類代碼中常看到"::"的操作符,這個是範圍限定操作符,是用一個雙冒號"::"表示,它用來置頂類中不同範圍的層級。左邊是範圍右邊是訪問範圍的成員。
在php中定義的範圍有self和parent兩種(在php6中提供了static範圍)。
範圍解析操作符(也可稱作 Paamayim Nekudotayim)或者更簡單地說是一對冒號,可以用於訪問靜態成員、方法和常量,還可以用於子類覆蓋父類中的成員和方法。
class MyClass {
const CONST_VALUE = 'A constant value';
}
echo MyClass::CONST_VALUE;
class OtherClass extends MyClass
{
public static $my_static = 'static var';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
OtherClass::doubleColon();
//子類覆蓋父類
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// 覆蓋父類中的方法
public function myFunc()
{
// 但仍然可以調用已被覆蓋的方法
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
4 php中this和self以及parent的作用
this:就是指向當前對象執行個體的指標,不指向任何其他對象或類。
self:表示當前類的範圍,與this不同的是它不表示類的某個特定執行個體,在類之外的代碼中不能使用self,而且它不能識別自己在繼承中層次的位置。也就是說,當在擴充類中使用self時,它調用的不是父類的方法,而是擴充類的重載的方法。self是指向類本身,也就是self是不指向任何已經執行個體化的對象,一般self使用來指向類中的靜態變數。
private static $firstCount = 0;
private $lastCount;
//建構函式
function __construct()
{
$this->lastCount = ++self:$firstCount; //使用self來調用靜態變數,使用self調用必須使用::(域運算子號)
}
parent:表示當前類父類的範圍,其餘的跟self特性一樣。parent是指向父類的指標,一般我們使用parent來調用父類的建構函式。
//繼承類的建構函式
function __construct( $personSex, $personAge )
{
parent::__construct( "test" ); //使用parent調用了父類的建構函式
$this->personSex = $personSex;
$this->personAge = $personAge;
}
5 建構函式與解構函式
具有建構函式的類會在每次建立對象時先調用此方法,所以非常適合在使用對象之前做一些初始化工作。
function __construct() {}
如果子類中定義了建構函式則不會暗中調用其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中調用
parent::__construct()。
PHP 5 引入了解構函式的概念,這類似於其它物件導向的語言,如 C++。解構函式會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。
function __destruct() {}
6 final 關鍵字
PHP 5 新增了一個 final 關鍵字。如果父類中的方法被聲明為final,則子類無法覆蓋該方法; 如果一個類被聲明為final,則不能被繼承。
7 繼承和建構函式
父類 |
子類 |
結果 |
有建構函式 |
無建構函式 |
父構造 |
有建構函式 |
有建構函式 |
子構造 |
8 介面
可以通過interface來定義一個介面,就像定義一個標準的類一樣。
注意:
1)但其中定義所有的方法都是空的;
2)介面中定義的所有方法都必須是public,這是介面的特性;
3)實現多個介面時,介面中的方法不能有重名;
4)介面也可以繼承,通過使用extends操作符;
5)介面中也可以定義常量。介面常量和類常量的使用完全相同。 它們都是定值,不能被子類或子介面修改。
// 聲明一個'iTemplate'介面
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 實現介面
// 下面的寫法是正確的
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
9 屬性
類的變數成員叫做“屬性”,屬性聲明是由關鍵字public或者protected或者private開頭,然後跟一個變數來組成。 屬性中的變數可以初始化,但是初始化的值必須是常數,這裡的常數是指php指令碼在編譯階段時就為常數,而不是在編譯階段之後在運行階段運算出的常數。
在PHP5 中,預定義了兩個函數“__get()”和“__set()”來獲
取和賦值其屬性,以及檢查屬性的“__isset()”和刪除屬性的方法“__unset()”。
簡單的說一個是取值,一個是賦值。,“__set()”和“__get()”這兩個方法,這兩個方法不是預設存在的,而是我們手工添加到類裡面去的,像構造方法(__construct())一樣, 類裡面添加了才會存在,可以按下面的方式來添加這兩個方法,當然也可以按個人的風格來添加://__get()方法用來擷取私人屬性
view plaincopy to clipboardprint?
- <?php
- class Person{
- //下面是人的成員屬性
- private $name; //人的名字
- private $sex; //人的性別
- private $age; //人的年齡
- //__get()方法用來擷取私人屬性
- private function __get($property_name){
- if(isset($this->$property_name)){
- return($this->$property_name);}else {
- return(NULL);
- }
- }
- }
- //__set()方法用來設定私人屬性
- private function __set($property_name, $value){
- $this->$property_name = $value;
- }
- //__isset()方法
- private function __isset($nm){
- echo "isset()函數測定私人成員時,自動調用<br>";
- return isset($this->$nm);
- }
- //__unset()方法
- private function __unset($nm){
- echo "當在類外部使用unset()函數來刪除私人成員時自動調用的<br>";
- unset($this->$nm);
- }
- }
- $p1=new Person();
- $p1->name="this is a person name";
- //在使用isset()函數測定私人成員時,自動調用__isset()方法幫我們完成,返回結果為true
- echo var_dump(isset($p1->name))."<br>";
- echo $p1->name."<br>";
- //在使用unset()函數刪除私人成員時,自動調用__unset()方法幫我們完成,刪除name私人屬性
- unset($p1->name);
- //已經被刪除了, 所這行不會有輸出
- echo $p1->name;
- ?>
<?php class Person{ //下面是人的成員屬性 private $name; //人的名字 private $sex; //人的性別 private $age; //人的年齡 //__get()方法用來擷取私人屬性 private function __get($property_name){ if(isset($this->$property_name)){ return($this->$property_name);}else<br /> { return(NULL); } } } //__set()方法用來設定私人屬性 private function __set($property_name, $value){ $this->$property_name = $value; } //__isset()方法 private function __isset($nm){ echo "isset()函數測定私人成員時,自動調用<br>"; return isset($this->$nm); } //__unset()方法 private function<br /> __unset($nm){ echo "當在類外部使用unset()函數來刪除私人成員時自動調用的<br>"; unset($this->$nm); } } $p1=new Person(); $p1->name="this is a person name"; //在使用isset()函數測定私人成員時,自動調用__isset()方法幫我們完成,返回結果為true echo var_dump(isset($p1->name))."<br>"; echo $p1->name."<br>"; //在使用unset()函數刪除私人成員時,自動調用__unset()方法幫我們完成,刪除name私人屬性<br /> unset($p1->name); //已經被刪除了, 所這行不會有輸出 echo $p1->name; ?>
10 複製
對象複製可以通過clone關鍵字來完成(如果對象中存在__clone()方法,會先被調用)。對象中的 __clone()方法不能直接調用。
當對象被複製後,PHP5會對對象的所有屬性執行一個“淺複製”(shallow copy)。所有的屬性中的引用 仍然不變,指向原來的變數。如果定義了__clone()方法,則新建立的對象(複製產生的對象)中的__clone()方法會被調用, 可用於修改屬性的值(如果有必要的話)。