php抽象類繼承抽象類,PHP面向對象程序設計高級特性詳解(接口,繼承,抽象類,析構,克隆等)...

本文實例講述了PHP面向對象程序設計高級特性。分享給大家供大家參考,具體如下:

靜態屬性

class StaticExample {

static public $aNum = 0; // 靜態共有屬性

static public function sayHello() { // 靜態共有方法

print "hello";

}

}

print StaticExample::$aNum;

StaticExample::sayHello();

?>

輸出:0??? hello

點評:靜態屬性和方法,可以通過類直接調用。

SELF

class StaticExample {

static public $aNum = 0;

static public function sayHello() { // 這里的static 和 public的順序可以顛倒

self::$aNum++;

print "hello (".self::$aNum.")\n"; // self 指向當前類, $this指向當前對象。

}

}

StaticExample::sayHello();

StaticExample::sayHello();

StaticExample::sayHello();

?>

輸出:

hello (1)

hello (2)

hello (3)

點評:self 指向當前類, this指向當前對象。self可以調用當前類的靜態屬性和方法。this指向當前對象。self可以調用當前類的靜態屬性和方法。this可以調用當前類的正常屬性和方法。

常量屬性

class ShopProduct {

const AVAILABLE = 0; // 只能用大寫字母命名常量

const OUT_OF_STOCK = 1;

public $status;

}

print ShopProduct::AVAILABLE;

?>

輸出:0

點評:常量只能用大寫字母,并且可以通過類直接調用。

接口

interface Chargeable { // 接口,抽象類是介于基類與接口之間的東西

public function getPrice();

}

class ShopProduct implements Chargeable {

// ...

protected $price;

// ...

public function getPrice() {

return $this->price;

}

// ...

}

$product = new ShopProduct();

?>

如果沒有實現getPrice方法,將會報錯。

Fatal error: Class ShopProduct contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Chargeable::getPrice)

繼承類與接口

class TimedService{ }

interface Bookable{ }

interface Chargeable{ }

class Consultancy extends TimedService implements Bookable, Chargeable { // 繼承類與接口

// ...

}

?>

抽象類

先來看一段代碼

abstract class DomainObject {

}

class User extends DomainObject {

public static function create() {

return new User();

}

}

class Document extends DomainObject {

public static function create() {

return new Document();

}

}

$document = Document::create();

print_r( $document );

?>

輸出:

Document Object

(

)

靜態方法

abstract class DomainObject {

private $group; // 私有屬性group

public function __construct() {

$this->group = static::getGroup();//static 靜態類

}

public static function create() {

return new static();

}

static function getGroup() { // 靜態方法

return "default";

}

}

class User extends DomainObject {

}

class Document extends DomainObject {

static function getGroup() { // 改變了內容

return "document";

}

}

class SpreadSheet extends Document { // 繼承之后,group也就與document相同了

}

print_r(User::create());

print_r(SpreadSheet::create());

?>

輸出:

User Object

(

[group:DomainObject:private] => default

)

SpreadSheet Object

(

[group:DomainObject:private] => document

)

final字段

使類無法被繼承,用的不多

final class Checkout { // 終止類的繼承

// ...

}

class IllegalCheckout extends Checkout {

// ...

}

$checkout = new Checkout();

?>

輸出:

Fatal error: Class IllegalCheckout may not inherit from final class (Checkout)

final方法不能夠被重寫

class Checkout {

final function totalize() {

// calculate bill

}

}

class IllegalCheckout extends Checkout {

function totalize() { // 不能重寫final方法

// change bill calculation

}

}

$checkout = new Checkout();

?>

輸出:

Fatal error: Cannot override final method Checkout::totalize()

析構函數

class Person {

protected $name;

private $age;

private $id;

function __construct( $name, $age ) {

$this->name = $name;

$this->age = $age;

}

function setId( $id ) {

$this->id = $id;

}

function __destruct() { // 析構函數

if ( ! empty( $this->id ) ) {

// save Person data

print "saving person\n";

}

if ( empty( $this->id ) ) {

// save Person data

print "do nothing\n";

}

}

}

$person = new Person( "bob", 44 );

$person->setId( 343 );

$person->setId( '' ); // 最后執行析構函數,使用完之后執行

?>

輸出:

do nothing

__clone方法

克隆的時候執行

class Person {

private $name;

private $age;

private $id;

function __construct( $name, $age ) {

$this->name = $name;

$this->age = $age;

}

function setId( $id ) {

$this->id = $id;

}

function __clone() { // 克隆時候執行

$this->id = 0;

}

}

$person = new Person( "bob", 44 );

$person->setId( 343 );

$person2 = clone $person;

print_r( $person );

print_r( $person2 );

?>

輸出:

Person Object

(

[name:Person:private] => bob

[age:Person:private] => 44

[id:Person:private] => 343

)

Person Object

(

[name:Person:private] => bob

[age:Person:private] => 44

[id:Person:private] => 0

)

再看一個例子

class Account { // 賬戶類

public $balance; // 余額

function __construct( $balance ) {

$this->balance = $balance;

}

}

class Person {

private $name;

private $age;

private $id;

public $account;

function __construct( $name, $age, Account $account ) {

$this->name = $name;

$this->age = $age;

$this->account = $account;

}

function setId( $id ) {

$this->id = $id;

}

function __clone() {

$this->id = 0;

}

}

$person = new Person( "bob", 44, new Account( 200 ) ); // 以類對象作為參數

$person->setId( 343 );

$person2 = clone $person;

// give $person some money

$person->account->balance += 10;

// $person2 sees the credit too

print $person2->account->balance; // person的屬性account也是一個類,他的屬性balance的值是210

// output:

// 210

?>

點評:學習還是能夠開拓大腦的,今天終于明白為什么有多個箭頭的概念了$person->account->balance。這里的account屬性是一個對象。

__toString

class Person {

function getName() { return "Bob"; }

function getAge() { return 44; }

function __toString() {

$desc = $this->getName()." (age ";

$desc .= $this->getAge().")";

return $desc;

}

}

$person = new Person();

print $person; // 打印時候集中處理

// Bob (age 44)

?>

點評:必須是print或echo時才有效,print_r就輸出對象。

Person Object()

希望本文所述對大家PHP程序設計有所幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Typora markdown公式換行等號對齊_Typora編寫博客格式化文檔的最佳軟件

Typora-編寫博客格式化文檔的最佳軟件Typora 不僅是一款支持實時預覽的 Markdown 文本編輯器,而且還支持數學公式、代碼塊、思維導圖等功能。它有 OS X、Windows、Linux 三個平臺的版本,是完全免費的。作為技術人員或者專業人員,使用Markdown…

Bootstrap靜態cdn

百度的靜態資源庫的 CDN 服務http://cdn.code.baidu.com/ &#xff0c;訪問速度更快、加速效果更明顯、沒有速度和帶寬限制、永久免費,引入代碼如下&#xff1a; <!-- 新 Bootstrap 核心 CSS 文件 --> <link href"http://apps.bdimg.com/libs/bootstrap/3.3.0/…

php復習,PHP排序算法的復習和總結

直接上代碼吧&#xff01;/** 插入排序(一維數組)* 每次將一個待排序的數據元素&#xff0c;插入到前面已經排好序的數列中的適當的位置&#xff0c;使數列依然有序&#xff1b;直到待排序的數據元素全部插入完成為止。*/function insertSort($arr){if(!is_array($arr) || coun…

docker-machine

vbox安裝 sudo /sbin/vboxconfig &#xfffc; yum install gcc make yum install kernel-devel-3.10.0-514.26.2.el7.x86_64 轉載于:https://www.cnblogs.com/yixiaoyi/p/dockermachine.html

intention lock_寫作技巧:你寫出來的情節有用嗎?好情節的原則——LOCK系統

讀者喜歡一本小說的原因只有一個&#xff1a;很棒的故事。——Donald Maass來&#xff0c;話筒對準這位小作家&#xff0c;請問你是如何構思故事的&#xff1f;是習慣于現在腦海中把故事都想好了&#xff0c;才開始寫作&#xff1f;還是習慣于臨場發揮&#xff0c;喜歡一屁股坐…

zookeeper基本操作

1.客戶端連接 [txtest1 bin]$ jps 23433 Jps 23370 QuorumPeerMain #zookeeper進程[txtest1 bin]$ ./zkCli.sh -server test1:2182 Connecting to test1:2182 2018-01-24 23:42:09,024 [myid:] - INFO [main:Environment100] - Client environment:zookeeper.version3.4.5-…

sqllite java 密碼,SQLite登錄檢查用戶名和密碼

我正在創建一個應用程序(使用Java和SQLite)(JFrame&#xff0c;使用Netbeans)我有我想要登錄的用戶 . (我有所有正確的包JDBC&#xff0c;SQLite等)我遇到的問題似乎是獲取用戶名/密碼來檢查我的users.db文件..我正在使用Java和SQLite . 我也在使用JDBC .我的一些代碼作為一個例…

springmvc與struts2的區別

1&#xff09;springmvc的入口是一個servlet&#xff0c;即前端控制器&#xff0c;例如&#xff1a;*.action struts2入口是一個filter過慮器&#xff0c;即前端過濾器&#xff0c;例如&#xff1a;/* 2&#xff09;springmvc是基于方法開發&#xff0c;傳遞參數是通過方法形…

power designer數據流圖_鯤云公開課 | 三分鐘帶你了解數據流架構

目前&#xff0c;市場上的芯片主要包括指令集架構和數據流架構兩種實現方式。指令集架構主要包括X86架構、ARM架構、精簡指令集運算RISC-V開源架構&#xff0c;以及SIMD架構。總體來說&#xff0c;四者都屬于傳統的通用指令集架構。傳統的指令集架構采用馮諾依曼計算方式&#…

onCreate源碼分析

原文地址Android面試題-onCreate源碼都沒看過&#xff0c;怎好意思說自己做android Activity扮演了一個界面展示的角色&#xff0c;堪稱四大組件之首&#xff0c;onCreate是Activity的執行入口&#xff0c;都不知道入口到底干了嘛&#xff0c;還學什么android,所以本文會從源碼…

linux php環境搭建教程,linux php環境搭建教程

linux php環境搭建的方法&#xff1a;首先獲取相關安裝包&#xff1b;然后安裝Apache以及mysql&#xff1b;接著修改配置文件“httpd.conf”&#xff1b;最后設置環境變量和開機自啟&#xff0c;并編譯安裝PHP即可。一、獲取安裝包PHP下載地址&#xff1a;http://cn.php.net/di…

Apache2.2與Tomcat7集成方案詳解

原文地址&#xff1a;http://my.oschina.net/u/919173/blog/159206 ------------------------------------ 首先談一下為什么要集成Apache和tomcat7&#xff1f; Apache是當前使用最為廣泛的WWW服務器軟件&#xff0c;具有相當強大的靜態HTML處理的能力。 Tomcat服務器是一個…

cocos 制作動態生成內容的列表_零代碼工具,讓你在線輕松制作交互內容!

在工作中設計師不會寫代碼&#xff0c;懂代碼的不會設計&#xff0c;2種不同工作互掐的情況屢見不鮮&#xff0c;那我們如何把這2項工作一并融合貫通呢&#xff1f;對于不懂代碼的職場“小白”&#xff0c;我們可以利用一些零代碼工具來完成。今天小編介紹幾款在線開發設計工具…

php怎樣數據緩存文件,php數據緩存到文件類設計

// 自定義緩存類class Cache_Filesystem {// 緩存寫保存function set ($key, $data, $ttl) {//打開文件為讀/寫模式$h fopen($this->get_filename($key), ‘a‘);if (!$h) throw new Exception("Could not write to cache");flock($h, LOCK_EX); //寫鎖定&#x…

jsp放在web-inf下的注意事項

原文&#xff1a;http://blog.csdn.net/whatlookingfor/article/details/38381881 ------------------------------------------------- web-inf目錄是不對外開放的&#xff0c;外部沒辦法直接訪問到。所有只能通過映射來訪問&#xff0c;比如映射為一個action或者servlet通過…

php打印布爾型,PHP數據類型之布爾型的介紹_PHP

布爾類型是PHP中 最簡單的類型。它的值可以為 TRUE 或 FALSE。如&#xff1a;$foofalse;$foo1true;echo "為假時輸出值為:".$foo; //沒有輸出值echo "為真時輸出值為:".$foo1; //輸出1這里主要的細節&#xff1a;當轉換為 boolean 時&#xff0c;以下值被認…

oracle 如何終止存儲過程的運行

0.查詢正在執行的存儲過程&#xff1a; select * from v$db_object_cache where locks > 0 and pins > 0 and typePROCEDURE;1. 在V$ACCESS視圖中找到要停止進程的SID: 舉例&#xff1a;存儲過程名&#xff1a;CRH_ENTRY SELECT t.* FROM V$ACCESS t WHERE t.objectCRH_…

python install zabbix.4.0

1.安裝 MySQLdb 模塊; #!/bin/bash #this is rpm python Environment depends on function depends_rpm(){ yum clean all yum -y install gcc* python-devel python-pip mariadb mariadb-devel mariadb-server if [ $? -eq 0 ]thenpip install MySQL-python1.2.5 elsee…

asp.net 獲取全部在線用戶_Qamp;A | 在線考試問卷答疑

01.如何批量導入試題&#xff1f;如果您已經在word或者excel中準備好了考試文檔&#xff0c;通過批量導入試題的方式&#xff0c;可以讓考試問卷的制作更加方便快捷。詳細了解批量導入考試的文本格式&#xff1a;【點擊此處】02.如何進行考試隨機抽題&#xff1f;老師事先建立題…