PHP入門教程之面向?qū)ο蟮奶匦苑治?繼承,多態(tài),接口,抽象類,抽象方法等)
本文實(shí)例講述了PHP面向?qū)ο蟮奶匦?。分享給大家供大家參考,具體如下:
Demo1.php
<?php header('Content-Type:text/html; charset=utf-8;'); //創(chuàng)建一個電腦類 class Computer { //什么叫做類內(nèi),就是創(chuàng)建類的花括號內(nèi)的范圍叫做類內(nèi),其他地方則類外。 //public 是對字段的公有化,這個字段類外即可訪問,賦值和取值 public $_name = '聯(lián)想'; } $computer = new Computer(); $computer -> _name = 'Dell'; echo $computer->_name; ?>
Demo2.php
<?php header('Content-Type:text/html; charset=utf-8;'); class Computer { //private 是私有化,即對字段進(jìn)行封裝的操作,類外無法訪問,取值和賦值都不能操作 private $_name = '聯(lián)想'; } $computer = new Computer(); echo $computer->_name; ?>
Demo3.php
<?php header('Content-Type:text/html; charset=utf-8;'); class Computer { private $_name = '聯(lián)想'; //這個時候我采用一個公共對外的方法來訪問私有字段 //因?yàn)樗接凶侄沃荒茉陬悆?nèi)訪問,而對外的公共方法是類內(nèi)的。 //更而公共方法又是公共的,所以類外又可訪問。 public function _run(){ //字段在類內(nèi)調(diào)用的時候必須是類 -> 字段,而$_name只是一個普通變量而已。 //字段在類外調(diào)用的方法是對象 -> 字段,而類內(nèi)就必須使用 Computer -> _name //但是在本類中,可以使用一個關(guān)鍵字來代替字來代替 Computer ,那就是 $this echo $this ->_name; } } $computer = new Computer(); $computer -> _run(); ?>
Demo4.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { private $name; private $model; private $cpu; private $keyboard; private $show; private $zb; //必須寫個對外的入口,才可以取到 public function getName() { return $this->name; } //必須寫一個對內(nèi)的入口,對私有字段進(jìn)行賦值 public function setName($name) { //這里的 $name 只是一個變量而已,參數(shù)而已 //$this->name 才是類的字段 $this->name = $name; } } $computer = new Computer (); echo $computer->getName(); $computer->setName('Dell'); echo $computer->getName(); ?>
Demo5.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { private $_name; private $_model; private $_cpu; //當(dāng)類外的對象直接調(diào)用私有字段時,會跟著去檢查是否有攔截器, //如果直接對 $_name 進(jìn)行賦值,那么__set 方法就會攔截住,就不會報(bào)錯了。 //采用攔截器進(jìn)行賦值和取值 //賦值 private function __set($_key,$_value){ //采用$_key = '_name',那么 $_value = '聯(lián)想'; //$this ->_name = '聯(lián)想'; $this ->$_key = $_value; } //取值 private function __get($_key){ return $this -> $_key; //如果 $_key = '_name' 那么 $this -> _name; //如果 $_key = '_cpu' 那么 $this -> _cpu; //如果 $_key = '_model' 那么 $this -> _model; } } $computer = new Computer (); $computer->_name = '聯(lián)想'; $computer->_cpu = '四核'; $computer->_model = 'i7'; echo $computer->_name; echo $computer->_cpu; echo $computer->_model; ?>
Demo6.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { private $_name; private $_model; private $_cpu; //__set 和 __get 方法私有了,還是可以執(zhí)行,是因?yàn)? //因?yàn)槟壳俺绦虻闹羔樢呀?jīng)在類內(nèi)了。而類內(nèi)可以執(zhí)行封裝的方法 //類內(nèi)執(zhí)行私有方法,不會出現(xiàn)任何錯誤。 //它只需要間接的攔截就可以了。攔截是在內(nèi)類執(zhí)行的。 //說白了,__set() 和 __get() 是 PHP 內(nèi)置的方法,具有一定的特殊性 private function __set($_key, $_value) { $this->$_key = $_value; } private function __get($_key) { return $this->$_key; } } $computer = new Computer (); $computer->_name = '聯(lián)想'; $computer->_cpu = '四核'; $computer->_model = 'i7'; echo $computer->_name; echo $computer->_cpu; echo $computer->_model; ?>
Demo7.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { const NAME = 'DELL'; } //常量的輸出方法 類::常量 echo Computer::NAME; //DELL ?>
Demo8.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { public $_count = 0; public function _add(){ $this -> _count++; //$_count = $_count+1 $_count++ } } //做一個累計(jì)的效果 $computer1 = new Computer(); $computer1 ->_add(); $computer1 ->_add(); $computer1 ->_add(); echo $computer1 -> _count; echo '<br />'; $computer2 = new Computer(); $computer2 ->_add(); $computer2 ->_add(); $computer2 ->_add(); echo $computer2 -> _count; ?>
Demo9.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { public static $_count = 0; public function _add(){ //如果是靜態(tài)成員字段,那么就應(yīng)該用 self 來調(diào)用,而不是 $this self::$_count++; } } //做一個累計(jì)的效果 $computer1 = new Computer(); $computer1 ->_add(); echo Computer::$_count; $computer1 ->_add(); echo Computer::$_count; $computer1 ->_add(); echo Computer::$_count; echo '<br />'; $computer2 = new Computer(); $computer2 ->_add(); echo Computer::$_count; $computer2 ->_add(); echo Computer::$_count; $computer2 ->_add(); echo Computer::$_count; ?>
Demo10.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { public static $_count = 0; public static function _add(){ self::$_count++; } } Computer::_add(); Computer::_add(); Computer::_add(); echo Computer::$_count; ?>
Demo11.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { } $computer = new Computer(); echo $computer instanceof Computer; ?>
Demo12.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); //這是父類,電腦類 class Computer { public $_name = '聯(lián)想'; public function _run(){ echo '聯(lián)想在運(yùn)行!'; } } //子類,筆記本電腦類 class NoteComputer extends Computer { } $noteComputer = new NoteComputer(); echo $noteComputer -> _name; $noteComputer -> _run(); ?>
Demo13.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { public $_name = '聯(lián)想'; public function _run(){ echo '聯(lián)想在運(yùn)行!'; } } class NoteComputer extends Computer { //我不需要父類的字段和方法,那么可以采用重寫的方法覆蓋掉父類的字段和方法 public $_name = 'Dell'; public function _run(){ echo 'Dell在運(yùn)行!'; } } $noteComputer = new NoteComputer(); echo $noteComputer -> _name; $noteComputer -> _run(); ?>
Demo14.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { //私有化,但是無法被子類繼承,這個時候就應(yīng)該用受保護(hù)的修飾符來封裝 protected $_name = '聯(lián)想'; protected function _run(){ return '聯(lián)想在運(yùn)行!'; } } class NoteComputer extends Computer { public function getTop() { echo $this->_name; echo $this->_run(); } } $noteComputer = new NoteComputer(); $noteComputer -> getTop(); ?>
Demo15.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); class Computer { public $_name = '聯(lián)想'; public function _run(){ return '聯(lián)想在運(yùn)行!'; } } class NoteComputer extends Computer { //我子類已經(jīng)覆蓋了父類的字段和方法, //但是我又要調(diào)用父類的字段和方法,那怎么辦呢? public $_name = 'Dell'; public function _run(){ echo 'Dell在運(yùn)行!'; echo parent :: _run(); } } $noteComputer = new NoteComputer(); echo $noteComputer -> _name; $noteComputer -> _run(); //DellDell在運(yùn)行!聯(lián)想在運(yùn)行! ?>
Demo16.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); //final 如果加在類前面,表示這個類不能被繼承 // final class Computer { // } class Computer { //final 如果加在方法前面,表示不能夠重寫些方法 final public function _run(){ } } class NoteComputer extends Computer { public function _run(){ } } $noteComputer = new NoteComputer(); ?>
Demo17.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); //創(chuàng)建一個抽象類,只要在 class 前面加上 abstract 就是抽象類了 //抽象類不能夠被實(shí)例化,就是創(chuàng)建對象 //只在類里面有一個抽象方法,那么這個類必須是抽象類,類前面必須加上 abstract abstract class Computer { public $_name = '聯(lián)想'; //抽象類里創(chuàng)建一個抽象方法 //抽象方法不能夠?qū)崿F(xiàn)方法體的內(nèi)容 abstract public function _run(); //我在抽象類里能否創(chuàng)建一個普通方法 public function _run2(){ echo '我是父類的普通方法'; } } //類不能夠?qū)崿F(xiàn)多繼承,只支持單繼承。 //抽象類是給子類用來繼承的,實(shí)現(xiàn)一種規(guī)范和資源的共享 class NoteComputer extends Computer { //抽象類的抽象方法,子類必須重寫,不然會報(bào)錯。 //抽象類里的普通方法不需要重寫,子類會直接繼承下來 public function _run(){ echo '我是子類的方法'; } } $noteComputer = new NoteComputer(); $noteComputer -> _run(); $noteComputer -> _run2(); echo $noteComputer -> _name; ?>
Demo18.php
<?php /* * 到底應(yīng)該用抽象類還是接口呢 * 如果你要繼承多個接口的方法規(guī)范,那么就用接口好了。 * 如果你要共享一個方法體內(nèi)容,那么就用抽象類。 * */ header ( 'Content-Type:text/html; charset=utf-8;' ); //創(chuàng)建一個接口 //接口也不能被實(shí)例化 //接口是為了規(guī)范實(shí)現(xiàn)它的子類,以達(dá)到統(tǒng)一的目的。也可以共享數(shù)據(jù) interface Computer { //成員字段必須是變量 const NAME = '成員 '; //接口里的所有方法都是抽象方法,不能夠?qū)懛椒w //并且接口的抽象方法不需要寫 abstract public function _run(); public function _run2(); } interface Computer2 { public function _run3(); } //子類繼承接口的說法,叫做實(shí)現(xiàn),接口可以多實(shí)現(xiàn) class NoteComputer implements Computer,Computer2 { public function _run() { echo '我重寫了run'; } public function _run3() { echo '我重寫了run3'; } public function _run2() { echo '我重寫了run2'; } } $noteComputer = new NoteComputer(); $noteComputer -> _run(); $noteComputer -> _run2(); $noteComputer -> _run3(); echo NoteComputer::NAME; //接口 :: 常量 //echo Computer::NAME; ?>
Demo19.php
<?php header ( 'Content-Type:text/html; charset=utf-8;' ); //什么叫做多態(tài),字面意思,多種形態(tài) //一個動作由不同的人去執(zhí)行,而產(chǎn)生不同的效果或者效果,即為多態(tài)。 //一個人通過不同的狀態(tài)去執(zhí)行同一種動作,形成不同的效果,也可以稱作為多態(tài)。 //園丁 剪 修理花草 //理發(fā)師 剪 理發(fā) //總裁 剪 裁員 //人 筆記本 運(yùn)行 win7開機(jī)了 //人 臺式機(jī) 運(yùn)行 xp開機(jī)了 //創(chuàng)建一個接口,來規(guī)范運(yùn)行的方法 interface Computer { public function version(); //這個方法表示采用什么電腦 public function work(); //這臺電腦是怎么運(yùn)行的 } //創(chuàng)建一個筆記本的類實(shí)現(xiàn)接口 class NoteComputer implements Computer { public function version() { echo '筆記本'; } public function work() { echo '可以便攜式運(yùn)行 win7'; } } //創(chuàng)建一個臺式機(jī)的類實(shí)現(xiàn)接口 class DesktopComputer implements Computer { public function version() { echo '臺式機(jī)'; } public function work() { echo '在工作站運(yùn)行 XP'; } } //創(chuàng)建一個用戶 class Person { //創(chuàng)建一個方法來接受電腦(筆記本電腦,也可以是臺式電腦) //怎么接受,將他們的對象傳進(jìn)來就 OK 啦。 public function _run($type) { echo '這個人的'; $type -> version(); $type ->work(); } } //多態(tài)的原理,就是類都寫好了,不要去修改它,只要在類外的調(diào)用參數(shù)的更改 //而最后的結(jié)果也會得到更改,那么這個就是多態(tài)。 //有一個接口,兩個類,一個是筆記本的類,一個是臺式機(jī)的類 //創(chuàng)建了筆記本 $noteComputer = new NoteComputer(); //創(chuàng)建臺式機(jī) $desktopComputer = new DesktopComputer(); //創(chuàng)建一個人 $person = new Person(); //使用電腦 $person -> _run($noteComputer); //這種傳遞,叫做對象引用的傳遞 ?>
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。
- PHP SPL標(biāo)準(zhǔn)庫之接口(Interface)詳解
- 領(lǐng)悟php接口中interface存在的意義
- php 接口類與抽象類的實(shí)際作用
- PHP中關(guān)鍵字interface和implements詳解
- PHP abstract與interface之間的區(qū)別
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之接口用法
- PHP面向?qū)ο蟮倪M(jìn)階學(xué)習(xí)(抽像類、接口、final、類常量)
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)高級特性詳解(接口,繼承,抽象類,析構(gòu),克隆等)
- PHP接口類(interface)的定義、特點(diǎn)和應(yīng)用示例
相關(guān)文章
PHP 防注入函數(shù)(格式化數(shù)據(jù))
下面的函數(shù)通過格式化數(shù)據(jù)的方法實(shí)現(xiàn)數(shù)據(jù)的addslashes,不過也建議大家參考下discuz的防注入函數(shù)。2011-08-08php 批量生成html,txt文件的實(shí)現(xiàn)代碼
本篇文章是對使用php批量生成html,txt文件的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php實(shí)現(xiàn)的一個簡單json rpc框架實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的一個簡單json rpc框架實(shí)例,本文給出了RPC服務(wù)端和客戶端代碼以及應(yīng)用實(shí)例,需要的朋友可以參考下2015-03-03