本文實例講述了PHP面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)。分享給大家供大家參考,具體如下:
我們可以使用接口(interface),指定某個類必須實現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容,我們可以通過 interface 關(guān)鍵字來定義,就像定義一個標準的類一樣,但其中定義所有的方法都是空的,但是其中定義的所有方法都必須是公有,這是接口的特性。
但是我們?nèi)绻獙崿F(xiàn)一個接口,就得使用 implements
操作符,并且類中必須實現(xiàn)接口中定義的所有方法,否則會報一個致命錯誤,其中類還可以實現(xiàn)多個接口,用逗號來分隔多個接口的名稱,是不是很神奇???來看實例感受下:
?php
// 聲明一個'iTemplate'接口
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 實現(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ù)學運算的結(jié)果或函數(shù)調(diào)用。自 PHP 5.3.0 起,我們可以用一個變量來動態(tài)調(diào)用類,但該變量的值不能為關(guān)鍵字(如 self,parent 或 static),來看實例感受下:
?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 起
?>
任何一個類,如果它里面至少有一個方法是被聲明為抽象的,那么這個類就必須被聲明為抽象的,并且,定義為抽象的類不能被實例化,完事呢,被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實現(xiàn),這是抽象類的一些公知的概念。
但是當繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法,另外,這些方法的訪問控制必須和父類中一樣(或者更為寬松)。舉個栗子,例如某個抽象方法被聲明為受保護的,那么子類中實現(xiàn)的方法就應(yīng)該聲明為受保護的或者公有的,而不能定義為私有的,了解了之后咱們就來看下實例:
?php
abstract class AbstractClass
{
// 強制要求子類定義這些方法
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ù),舉個栗子,例如,子類定義了一個可選參數(shù),而父類抽象方法的聲明里沒有,則也是可以正常運行的,如下:
?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)),它可以不實例化類而直接訪問,但是,靜態(tài)屬性不能通過一個類已實例化的對象來訪問(但靜態(tài)方法可以)。另外,由于靜態(tài)方法不需要通過對象即可調(diào)用,所以偽變量 $this
在靜態(tài)方法中不可用,也就是說,靜態(tài)屬性不可以由對象通過 ->
操作符來訪問。自 PHP 5.3.0 起,我們可以用一個變量來動態(tài)調(diào)用類,但該變量的值不能為關(guān)鍵字 self,parent 或 static,實例如下:
?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 新增了一個 final 關(guān)鍵字,它的作用就是,如果父類中的方法被聲明為 final,則子類無法覆蓋該方法,如果一個類被聲明為 final,則不能被繼承,如下案例,會報錯的哦:
?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;
}
}
// 報錯信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
PHP 不會在子類的構(gòu)造方法中自動的調(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)造方法不能自動調(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è)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
您可能感興趣的文章:- PHP面向?qū)ο蟪绦蛟O(shè)計之接口的繼承定義與用法詳解
- PHP面向?qū)ο笪宕笤瓌t之接口隔離原則(ISP)詳解
- PHP面向?qū)ο蟪绦蛟O(shè)計高級特性詳解(接口,繼承,抽象類,析構(gòu),克隆等)
- PHP入門教程之面向?qū)ο蟮奶匦苑治?繼承,多態(tài),接口,抽象類,抽象方法等)
- PHP面向?qū)ο蟪绦蛟O(shè)計之接口用法
- PHP 面向?qū)ο蟪绦蛟O(shè)計(oop)學習筆記(一) - 抽象類、對象接口、instanceof 和契約式編程
- PHP面向?qū)ο蟮倪M階學習(抽像類、接口、final、類常量)
- php學習筆記 面向?qū)ο笾衃接口]與[多態(tài)性]的應(yīng)用
- PHP 的ArrayAccess接口 像數(shù)組一樣來訪問你的PHP對象
- php面向?qū)ο笕ヂ?(十四) php5接口技術(shù)
- PHP 對象接口簡單實現(xiàn)方法示例