什么是抽象類
> 在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類
抽象類的特性
1. 定義為抽象的類不能被實例化
2. 如果它里面至少有一個方法是被聲明為抽象的,那么這個類就必須被聲明為抽象的
3. 被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現
4. 繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法(這些方法的訪問控制必須和父類中一樣(或者更為寬松))
5. 子類可以定義一個可選參數(**也就是必須要有默認值**),而父類抽象方法的聲明里沒有,則兩者的聲明并無沖突
6. 抽象類可以沒有抽象方法,反過來有抽象方法的類一定要聲明為抽象類
7. 抽象方法可以為靜態方法
~~~
<?php
abstract class AbstractClass
{
// 強制要求子類定義這些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut()
{
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
//父類定義了倆個抽象方法,如子類只實現了其中一個,則報如下錯誤
//Fatal error: Class ConcreteClass1 contains 1 abstract //method and must therefore be declared abstract or
//implement the remaining methods //(AbstractClass::prefixValue)
public function getValue()
{
return "ConcreteClass1";
}
// 且子類的訪問權限不能低于父類,如果將如下子類的訪問方式改為private則會報如下錯誤
//Fatal error: Access level to //ConcreteClass1::prefixValue() must be protected (as in //class AbstractClass) or weaker
public function prefixValue($prefix)
{
return "{$prefix}ConcreteClass1";
}
}
//當實例化一個抽象類時,Fatal error: Cannot instantiate //abstract class AbstractClass
//$obj = new AbstractClass();
// 但是我們可以這么使用
##########################################################
abstract class Foo
{
static function bar()
{
echo "test\n";
}
}
Foo::bar();
##########################################################
$obj = new ConcreteClass1();
echo $obj->getValue();
~~~
文章來源:
http://blog.csdn.net/fationyyk/article/details/51005929
- 前言
- 函數參考
- Socket 函數
- socket_accept
- socket_bind
- socket_clear_error
- socket_close
- socket_connect
- socket_create_listen
- socket_create_pair
- socket_create
- socket_getpeername
- socket_getsockname
- socket_last_error
- socket_listen
- socket_read
- socket_recv
- socket_select
- socket_send
- socket_set_block
- socket_set_nonblock
- SplQueue
- 魔術方法
- 魔術常量
- 雜項
- backlog的用處
- new self()和new static()的區別
- PHP變量的生命周期
- PHP抽象類
- 對象接口
- PHP中的常用關鍵字
- 常量
- 內存泄露
- global 與 $GLOBAL
- 簡單說明CGI和動態請求是什么
- 設計模式
- 單例模式
- 工廠模式
- 適配器模式
- 策略模式
- 觀察者模式
- 控制反轉IoC簡介
- session
- use_trans_sid
- auto_start
- session_id
- cookie_secure
- 面試
- 數據庫相關
- 語句相關
- 索引相關
- 字段相關
- PHP相關
- 字符串相關
- 函數相關
- 運算符優先級相關
- 錯誤相關
- redis相關
- 10個常見的Redis面試"刁難"問題
- mysql
- MySQL中的鎖
- MySQL存儲引擎MyISAM 和 InnoDB的區別
- MySQL半同步復制
- explain 命令詳解
- 索引
- 數據庫事務
- MySQL和B樹的那些事
- git
- github----向開源框架提交pr的過程
- 推薦博客
- linux
- 命令
- free
- 高并發
- 搶購/秒殺功能
- 算法
- 一致性Hash算法