PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【接口、抽象類、靜態(tài)方法等】
本文實(shí)例講述了PHP面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)。分享給大家供大家參考,具體如下:
我們可以使用接口(interface),指定某個(gè)類必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容,我們可以通過 interface 關(guān)鍵字來定義,就像定義一個(gè)標(biāo)準(zhǔn)的類一樣,但其中定義所有的方法都是空的,但是其中定義的所有方法都必須是公有,這是接口的特性。
但是我們?nèi)绻獙?shí)現(xiàn)一個(gè)接口,就得使用 implements
操作符,并且類中必須實(shí)現(xiàn)接口中定義的所有方法,否則會(huì)報(bào)一個(gè)致命錯(cuò)誤,其中類還可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來分隔多個(gè)接口的名稱,是不是很神奇???來看實(shí)例感受下:
<?php // 聲明一個(gè)'iTemplate'接口 interface iTemplate { public function setVariable($name, $var); public function getHtml($template); } // 實(shí)現(xiàn)接口 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; } }
我們可以把在類中始終保持不變的值定義為常量,但是在定義和使用常量的時(shí)候不需要使用 $ 符號(hào)。需要注意的就是,常量的值必須是一個(gè)定值,不能是變量,類屬性,數(shù)學(xué)運(yùn)算的結(jié)果或函數(shù)調(diào)用。自 PHP 5.3.0 起,我們可以用一個(gè)變量來動(dòng)態(tài)調(diào)用類,但該變量的值不能為關(guān)鍵字(如 self,parent 或 static),來看實(shí)例感受下:
<?php class MyClass { const constant = '常量值'; function showConstant() { echo self::constant . PHP_EOL; } } echo MyClass::constant . PHP_EOL; $classname = "MyClass"; echo $classname::constant . PHP_EOL; // 自 5.3.0 起 $class = new MyClass(); $class->showConstant(); echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起 ?>
任何一個(gè)類,如果它里面至少有一個(gè)方法是被聲明為抽象的,那么這個(gè)類就必須被聲明為抽象的,并且,定義為抽象的類不能被實(shí)例化,完事呢,被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實(shí)現(xiàn),這是抽象類的一些公知的概念。
但是當(dāng)繼承一個(gè)抽象類的時(shí)候,子類必須定義父類中的所有抽象方法,另外,這些方法的訪問控制必須和父類中一樣(或者更為寬松)。舉個(gè)栗子,例如某個(gè)抽象方法被聲明為受保護(hù)的,那么子類中實(shí)現(xiàn)的方法就應(yīng)該聲明為受保護(hù)的或者公有的,而不能定義為私有的,了解了之后咱們就來看下實(shí)例:
<?php abstract class AbstractClass { // 強(qiáng)制要求子類定義這些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . PHP_EOL; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') . PHP_EOL; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') . PHP_EOL; ?>
輸出結(jié)果為:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
我們還要記得,子類方法可以包含父類抽象方法中不存在的可選參數(shù),舉個(gè)栗子,例如,子類定義了一個(gè)可選參數(shù),而父類抽象方法的聲明里沒有,則也是可以正常運(yùn)行的,如下:
<?php abstract class AbstractClass { // 我們的抽象方法僅需要定義需要的參數(shù) abstract protected function prefixName($name); } class ConcreteClass extends AbstractClass { // 我們的子類可以定義父類簽名中不存在的可選參數(shù) public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; } } $class = new ConcreteClass; echo $class->prefixName("Pacman"), "\n"; echo $class->prefixName("Pacwoman"), "\n"; ?>
輸出結(jié)果為:
Mr. Pacman
Mrs. Pacwoman
聲明類屬性或方法為 static(靜態(tài)),它可以不實(shí)例化類而直接訪問,但是,靜態(tài)屬性不能通過一個(gè)類已實(shí)例化的對(duì)象來訪問(但靜態(tài)方法可以)。另外,由于靜態(tài)方法不需要通過對(duì)象即可調(diào)用,所以偽變量 $this
在靜態(tài)方法中不可用,也就是說,靜態(tài)屬性不可以由對(duì)象通過 ->
操作符來訪問。自 PHP 5.3.0 起,我們可以用一個(gè)變量來動(dòng)態(tài)調(diào)用類,但該變量的值不能為關(guān)鍵字 self,parent 或 static,實(shí)例如下:
<?php class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } } print Foo::$my_static . PHP_EOL; $foo = new Foo(); print $foo->staticValue() . PHP_EOL; ?>
輸出結(jié)果如下:
foo
foo
PHP 5 新增了一個(gè) final 關(guān)鍵字,它的作用就是,如果父類中的方法被聲明為 final,則子類無法覆蓋該方法,如果一個(gè)類被聲明為 final,則不能被繼承,如下案例,會(huì)報(bào)錯(cuò)的哦:
<?php class BaseClass { public function test() { echo "BaseClass::test() called" . PHP_EOL; } final public function moreTesting() { echo "BaseClass::moreTesting() called" . PHP_EOL; } } class ChildClass extends BaseClass { public function moreTesting() { echo "ChildClass::moreTesting() called" . PHP_EOL; } } // 報(bào)錯(cuò)信息 Fatal error: Cannot override final method BaseClass::moreTesting() ?>
PHP 不會(huì)在子類的構(gòu)造方法中自動(dòng)的調(diào)用父類的構(gòu)造方法,如果需要執(zhí)行父類的構(gòu)造方法,我們可以在子類的構(gòu)造方法中調(diào)用 parent::__construct()
,如下:
<?php class BaseClass { function __construct() { print "BaseClass 類中構(gòu)造方法" . PHP_EOL; } } class SubClass extends BaseClass { function __construct() { parent::__construct(); // 子類構(gòu)造方法不能自動(dòng)調(diào)用父類的構(gòu)造方法 print "SubClass 類中構(gòu)造方法" . PHP_EOL; } } class OtherSubClass extends BaseClass { // 繼承 BaseClass 的構(gòu)造方法 } // 調(diào)用 BaseClass 構(gòu)造方法 $obj = new BaseClass(); // 調(diào)用 BaseClass、SubClass 構(gòu)造方法 $obj = new SubClass(); // 調(diào)用 BaseClass 構(gòu)造方法 $obj = new OtherSubClass(); ?>
輸出結(jié)果為:
BaseClass 類中構(gòu)造方法
BaseClass 類中構(gòu)造方法
SubClass 類中構(gòu)造方法
BaseClass 類中構(gòu)造方法
好啦,本次記錄就到這里了。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
ThinkPHP中__initialize()和類的構(gòu)造函數(shù)__construct()用法分析
這篇文章主要介紹了ThinkPHP中__initialize()和類的構(gòu)造函數(shù)__construct()用法,以實(shí)例形式分析了ThinkPHP中類的初始化時(shí)構(gòu)造子類的方法,是采用ThinkPHP進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì)中比較重要的概念,需要的朋友可以參考下2014-11-11PHP之浮點(diǎn)數(shù)計(jì)算比較以及取整數(shù)不準(zhǔn)確的解決辦法
這篇文章主要介紹了PHP之浮點(diǎn)數(shù)計(jì)算比較以及取整數(shù)不準(zhǔn)確的解決辦法,代碼超簡(jiǎn)單,需要的朋友可以參考下2015-07-07PHP實(shí)現(xiàn)WebService的簡(jiǎn)單示例和實(shí)現(xiàn)步驟
這篇文章主要介紹了PHP實(shí)現(xiàn)WebService的簡(jiǎn)單示例和實(shí)現(xiàn)步驟,本文直接給出示例代碼并分步驟講解,需要的朋友可以參考下2015-03-03PHPStorm 2020.1 調(diào)試 Nodejs的多種方法詳解
這篇文章主要介紹了PHPSTORM 2020.1 調(diào)試 Nodejs的多種方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09php 替換文章中的圖片路徑,下載圖片到本地服務(wù)器的方法
下面小編就為大家分享一篇php 替換文章中的圖片路徑,下載圖片到本地服務(wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02php arsort 數(shù)組降序排序詳細(xì)介紹
php arsort函數(shù)用于將數(shù)組中的元素按照降序進(jìn)行排序,如果排序成功則返回true,否則返回false,本文章向大家講解arsort函數(shù)的基本語法及使用實(shí)例,需要的朋友可以參考下2016-11-11ThinkPHP自動(dòng)填充實(shí)現(xiàn)無限級(jí)分類的方法
這篇文章主要介紹了ThinkPHP自動(dòng)填充實(shí)現(xiàn)無限級(jí)分類的方法,是ThinkPHP項(xiàng)目開發(fā)中非常實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-08-08