PHP面向对象基础总结
?近來參加了幾場PHP工程師的面試,但是筆試題答得都不理想,回來總結(jié)了一下失敗的原因,是沒看PHP手冊。幾家公司的PHP基礎(chǔ)面試題都可以在PHP手冊上找到。哎,現(xiàn)在才知道最好的面試寶典是PHP手冊。
???????? 下面是一些PHP面向?qū)ο蠡A(chǔ)知識的摘錄,摘錄內(nèi)容來自PHP5.1手冊。
1.類的變量成員叫做“屬性”,或者叫“字段”、“特征”,在本文檔統(tǒng)一稱為“屬性”。
2.屬性中的變量可以初始化,但是初始化的值必須是常數(shù),這里的常數(shù)是指php腳本在編譯階段時就為常數(shù),而不是
在編譯階段之后在運(yùn)行階段運(yùn)算出的常數(shù)。
3.在類的成員方法里面,可以通過$this->property(property是屬性名字)這種方式來訪問類的屬性、 方法,但是
要訪問類的靜態(tài)屬性或者在靜態(tài)方法里面卻不能使用,而是使用self::$property。
4.在類的非靜態(tài)方法里面可以使用偽變量$this,這個偽變量是調(diào)用該方法的實例化對象引用
5.常量的值必須是一個定值,不允許修改,且不能是變量,類屬性或其它操作(如函數(shù)調(diào)用)的結(jié)果。?
<?phpclass MyClass{const constant = 'constant value';function showConstant() {echo? self::constant . "\n";}}echo MyClass::constant . "\n";$n=new MyClass();$n->showConstant();?>6.構(gòu)造函數(shù)的類會在每次創(chuàng)建對象時先調(diào)用此方法,所以非常適合在使用對象之前做一些初始化工作。?
如果子類中定義了構(gòu)造函數(shù)則不會暗中調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中
調(diào)用 parent::__construct()。
7.析構(gòu)函數(shù)會在到某個對象的所有引用都被刪除或者當(dāng)對象被顯式銷毀時執(zhí)行。
父類的析構(gòu)函數(shù)不會被引擎暗中調(diào)用。要執(zhí)行父類的析構(gòu)函數(shù),必須在子類的析構(gòu)函數(shù)體中顯式調(diào)用
parent::__destruct()。
析構(gòu)函數(shù)在腳本關(guān)閉時調(diào)用,此時所有的頭信息已經(jīng)發(fā)出。?
試圖在析構(gòu)函數(shù)中拋出一個異常會導(dǎo)致致命錯誤。
8.當(dāng)擴(kuò)展一個類,子類就會繼承父類的所有公有和保護(hù)方法。但是子類的方法會覆蓋父類的方法。
9.范圍解析操作符(::),可以用于訪問靜態(tài)成員、方法和常量
當(dāng)在類的外部訪問這些靜態(tài)成員、方法和常量時,必須使用類的名字。?
self 和 parent這兩個特殊的關(guān)鍵字是用于在類的內(nèi)部對成員或方法進(jìn)行訪問的。
10.當(dāng)一個子類覆蓋其父類中的方法時,PHP 不會再執(zhí)行父類中已被覆蓋的方法,直到子類中調(diào)用這些方法為止。這
種機(jī)制也作用于 構(gòu)造函數(shù)和析構(gòu)函數(shù)、重載 及 魔術(shù) 函數(shù)。
11.靜態(tài)變量和方法
聲明類成員或方法為static,就可以不實例化類而直接訪問。不能通過一個對象來訪問其中的靜態(tài)成員(靜態(tài)方法
除外)。?
由于靜態(tài)方法不需要通過對象即可調(diào)用,所以偽變量$this在靜態(tài)方法中不可用。?
靜態(tài)屬性不可以由對象通過->操作符來訪問。?
用::方式調(diào)用一個非靜態(tài)方法會導(dǎo)致一個E_STRICT級別的錯誤。?
就像其它所有的PHP靜態(tài)變量一樣,靜態(tài)屬性只能被初始化為一個字符值或一個常量,不能使用表達(dá)式。 所以你可
以把靜態(tài)屬性初始化為整型或數(shù)組,但不能指向另一個變量或函數(shù)返回值,也不能指向一個對象。
?
12.如果沒有指定“可見性”,屬性和方法默認(rèn)為public。
13.抽象類
抽象類不能直接被實例化,你必須先繼承該抽象類,然后再實例化子類。抽象類中 至少要包含一個抽象方法。如果
類方法被聲明為抽象的,那么其中就不能包括具體的功能實現(xiàn)。?
繼承一個抽象類的時候,子類必須實現(xiàn)抽象類中的所有抽象方法;另外,這些方法的可見性 必須和抽象類中一樣(
或者更為寬松)。如果抽象類中某個抽象方法被聲明為protected,那么子類中實現(xiàn)的方法就應(yīng)該聲明為protected
或者public,而不 能定義為private。
應(yīng)用示例:
abstract class AbstractClass{// 強(qiáng)制要求子類定義這些方法abstract protected function getValue();abstract protected function prefixValue($prefix);// 普通方法(非抽象方法)public function printOut() {print $this->getValue() . "\n";}}class ConcreteClass1 extends AbstractClass{protected function getValue() {return "ConcreteClass1";}public function prefixValue($prefix) {return "{$prefix}ConcreteClass1";}}14.使用接口(interface),你可以指定某個類必須實現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。?
我們可以通過interface來定義一個接口,就像定義一個標(biāo)準(zhǔn)的類一樣,但其中定義所有的方法都是空的。?
接口中定義的所有方法都必須是public,這是接口的特性。?
要實現(xiàn)一個接口,可以使用implements操作符。類中必須實現(xiàn)接口中定義的所有方法,否則 會報一個fatal錯誤。
如果要實現(xiàn)多個接口,可以用逗號來分隔多個接口的名稱。?
實現(xiàn)多個接口時,接口中的方法不能有重名。?
接口也可以繼承,通過使用extends操作符。
接口中也可以定義常量。接口常量和類常量的使用完全相同。 它們都是定值,不能被子類或子接口修改。
應(yīng)用示例:
//接口定義
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;}}15.PHP5提供了一種迭代(iteration)對象的功能,就像使用數(shù)組那樣,可以通過foreach來遍歷對象中的屬性。
默認(rèn)情況下,在外部迭代只能得到外部可見的屬性的值。?
應(yīng)用示例:
<?phpclass MyClass{public $var1 = 'value 1';public $var2 = 'value 2';public $var3 = 'value 3';protected $protected = 'protected var';private?? $private?? = 'private var';function iterateVisible() {echo "MyClass::iterateVisible:\n";foreach($this as $key => $value) {print "$key => $value\n";}}}$class = new MyClass();foreach($class as $key => $value) {print "$key => $value\n";}echo "\n";$class->iterateVisible();?>16.設(shè)計模式
工廠模式(Factory)允許你在代碼執(zhí)行時實例化對象。它之所以被稱為工廠模式是因為它負(fù)責(zé)“生產(chǎn)”對象。工廠
方法的參數(shù)是 你要生成的對象對應(yīng)的類名稱。
單例模式(Singleton)用于為一個類生成一個唯一的對象。最常用的地方是數(shù)據(jù)庫連接。 使用單例模式生成一個
對象后,該對象可以被其它眾多對象所使用。?
應(yīng)用示例:
<?phpclass Example{// 保存類實例在此屬性中private static $instance;// 構(gòu)造方法聲明為private,防止直接創(chuàng)建對象private function __construct()?{echo 'I am constructed';}// singleton 方法public static function singleton()?{if (!isset(self::$instance)) {$c = __CLASS__;self::$instance = new $c;}return self::$instance;}// Example類中的普通方法public function bark(){echo 'Woof!';}// 阻止用戶復(fù)制對象實例public function __clone(){trigger_error('Clone is not allowed.', E_USER_ERROR);}}?>?
這樣我們可以得到一個獨(dú)一無二的Example類的對象。
<?php// 這個寫法會出錯,因為構(gòu)造方法被聲明為private$test = new Example;// 下面將得到Example類的單例對象$test = Example::singleton();$test->bark();// 復(fù)制對象將導(dǎo)致一個E_USER_ERROR.$test_clone = clone $test;?>17.PHP 5 新增了一個 final 關(guān)鍵字。如果父類中的方法被聲明為final,則子類無法覆蓋該方法; 如果一個類被
聲明為final,則不能被繼承。
18.對象復(fù)制可以通過clone關(guān)鍵字來完成(如果對象中存在__clone()方法,會先被調(diào)用)。對象中的 __clone()
方法不能直接調(diào)用。?
$copy_of_object = clone $object;
當(dāng)對象被復(fù)制后,PHP5會對對象的所有屬性執(zhí)行一個“淺復(fù)制”(shallow copy)。所有的屬性中的引用 仍然不
變,指向原來的變量。如果定義了__clone()方法,則新創(chuàng)建的對象(復(fù)制生成的對象)中的__clone()方法會被調(diào)
用, 可用于修改屬性的值(如果有必要的話)。
?
19.對象比較
當(dāng)使用對比操作符(==)比較兩個對象變量時,比較的原則是:如果兩個對象的屬性和屬性值 都相等,而且兩個對象
是同一個類的實例,那么這兩個對象變量相等。?
而如果使用全等操作符(===),這兩個對象變量一定要指向某個類的同一個實例(即同一個對象)。
20.對象和引用
php的引用是別名,就是兩個不同的變量名字指向相同的內(nèi)容。在php5,一個對象變量已經(jīng)不再保存整個對象的值。
只是保存一個標(biāo)識符來訪問真正的對象內(nèi)容。 當(dāng)對象作為參數(shù)傳遞,作為結(jié)果返回,或者賦值給另外一個變量,另
外一個變量跟原來的不是引用的關(guān)系,只是他們都保存著同一個標(biāo)識符的拷貝,這個標(biāo)識符指向同一個對象的真正
內(nèi)容
總結(jié)
以上是生活随笔為你收集整理的PHP面向对象基础总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP中Header函数和PHP_AUT
- 下一篇: 微众银行we2000备用金怎么申请