php 面向對象



面向對象 對象概念是面向對象技術的核心。在顯示世界裏我們所面對的事情都是對象,如計算機、電視機、自行車等。在面向對象的程序設計中,對象是一個由信息及對信息進行處理的描述所組成的整體,是對現實世界的抽象.

對象的主要三個特性
對象的行爲:可以對 對象施加那些操作,開燈,關燈就是行爲。
對象的形態:當施加那些方法是對象如何響應,顏色,尺寸,外型。
對象的表示:對象的表示就相當於身份證,具體區分在相同的行爲與狀態下有什麼不同。

面向對象模型

面向對象的概念:
oop(面向對象的編程)它能是其代碼更加簡潔易於維護並且具有更強的可重性

什麼是類:
類是具有相同屬性和服務的一組對象的集合比如說人,書,輪船,車都屬於類,他爲屬於該類的對象做了一個統一的抽象描述,在編程的語言中類是一個單獨的程序,它應該有一個類名包括屬性的說明和服務兩個部分。
什麼是對象:
對象是系統中描述客觀事件的一個實體,他是構成系統的一個基本單位。*數據與代碼都被捆綁在一個實體當中*,一個對象由一組屬性和對這組屬性進行操作的一組行爲組成。
從抽象的角度來說,對象是問題域或實現域中某些事物的一個抽象。他反映該事物在系統中保存的信息和發揮的作用:它是一組屬性和有權對這些屬性進行操作的一個封裝體。客觀世界是由對象和對象之間的聯繫組成的。
類和對象的關係:
類與對象的關係就如模具和鑄件的關係,類的實力化的結果就是對象,而對對象的抽象就是類,類描述了一組有相同特性(屬性)和相同行爲的對象。

類與屬性和方法
PHP中定義類語法格式:
class classname [可選屬性]{
public $property [=value];… //用public聲明一個公共標識 然後給予一個變量 變量也可以賦值
function functionname ( args ){ //類的方法裏的成員函數
代碼} …
//類的方法(成員函數)
}

生成對象(類的實例化): $對象名=new classname( );
使用對象的屬性
在一個類中,可以訪問一個特殊指針$this當在該類中通過一個操作設置或訪問該變量時,使用$this->name來引用.
對象的生成
定義好類後用一個new來聲明,由於對象資料的封裝特性,對象是無法由主程序區塊直接訪問的須通過對象來調用類中所定義的屬性和行爲函數,間接地達成存取控制類中資料的目的。
對象和類的關係
對象和類的關係:
對象是實際存在的,佔有動態資源。
類是對象的藍圖,可能佔有靜態資源。
對象屬性佔有動態資源
類(靜態)屬性實際上是有類名字空間上的“全局變量”
性能考慮:
每個對象要單獨佔用數據空間
增加的調用層次可能消耗執行時間
方法的參數形式和傳遞方式
方法的參數可以是基本數據類型、數組和類對象。
基本數據類型:值參傳遞
數組:值參傳遞
類對象:引用傳遞
構造函數
構造函數是在類中起到初始化的作用
構造函數的生成方法與其他函數一樣只是其名稱必須是__construct().
語法格式:function __construct(參數){
。。。。。。。。
}
範例:
class Person{
public $name;
public $sex;
public $age;
function __construct($name,$sex,$age){
echo "我是構造函數<br>";
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
輸出結果:初始化
析構函數
當對象脫離其作用域時(例如對象所在的函數已調用完畢),系統自動執行析構函數。應在退出前在析構函數中用釋放內存。
析構函數__destruct 析構函數沒有任何參數
範例:
class person{
function _ _destruct( )
{ echo "bye bye !“; }
}
$a=new person();

訪問類型
public 公共的(公共修飾符) 類內部與類外部都可以訪問的
private 私有的(私有修飾符) 只能在類內部訪問
protected 受保護的(保護成員修飾符) 子類可以訪問 類外部不可以訪問

oop的三個重要特性
封裝,繼承,多態
封裝性:封裝性就是把對象的屬性和行爲結合成一個獨立的單位。
封裝一個類需要兩步 第一步是私有化一個類 第二步是用set和get 做出讀取賦值的操作
他的好處是:隱藏類的實現細節,可以方便加入邏輯控制性,限制對屬性的不合理操作,便於修改增強代碼的可維護性。

__get與__set
一般說把類私有話更符合現實的邏輯。
預定義兩種函數來進行獲取與敷值操作。
__get 獲取值通常是域的值
__set 設置值通常是域的值
__call 調用一個對象中不存在的方法時,就會產生錯誤call()這個方法來處理這種情況。

靜態屬性和方法
static關鍵字 來聲明靜態方法
static靜態變量 在類的內部生成一個靜態變量 就是能夠被所有類的實力化共想 也就是說靜態成員則放到了“初始化靜態段”,在類第一次被加載的時候放入的,可以讓堆內存裏面的每個對象所共享
使用方法:self::$靜態屬性、self::靜態方法
static function p(){
echo self::$country;
echo self::PI;//訪問常量
//echo $this->name;在靜態方法中只能操作靜態屬性
//self::p();
}
外部調用:類::$靜態屬性、類::靜態方法

const關鍵字:用來生成常量 常量是唯一的不能改變的 慣例常量爲大寫
const CONSTANT = 'constant value'; 生成一個常量
echo self::CONSTANT;//類內部訪問
echo ClassName::CONSTANT;//類外部訪問

繼承性
B類的對象擁有A類的全部屬性與行爲,稱作B對A類的繼承。
假如一個類從多個類中繼承了屬性與服務,這稱爲多繼承,通常我們成爲繼承類爲子類被繼承類爲父類,在PHP中只有單繼承,但一個父類可以被多個類繼承,但是一個子類只能有一個父類,但是允許關聯繼承,通過繼承可以減化類的定義。
extende聲明繼承關係
語法格式:class B extends A 此範例指明 B繼承了A
類的外部訪問對子類是有效的
子類與父類的屬性與方法
子類繼承父類的所有內容,但父類中的private部分不能直接訪問
子類中新增加的屬性和方法是對父類的擴展
子類中定義的與父類同名的屬性是對父類屬性的覆蓋,同名的方法也是對父類方法的覆蓋

重寫的方法
在子類中,使用parent訪問父類中的被覆蓋的屬性和方法
parent::__construce();
parent::$name;
parent::fun();

覆蓋父類原有屬性
clone克窿對象 語法格式$c=clone $p; $c克窿的對象$p 輸出echo $c->name;

對象比較
===兩個比較運算符。
==是比較兩個對象的內容。
===是比較對象的句柄,即引用地址。

instanceof操作符用於檢測對象實力是否屬於某一個類的類型 屬於返回true 不屬於返回false
__clone()如果想在克隆後改變原對象的內容,需要在__clone()中重寫原本的屬性和方法
function __clone(){
$this->name="我是一個克隆人";
}

final表示一個類是最終版本 也就是說它不能在被子類調用

多態性

多態性是指在父類中定義的屬性或行爲被子類繼承之後,可以具有不同的數據類型或表現出不同的行爲。這使得同一個屬性或行爲在父類及其各個子類中具有不同的語義。
就是說同一種方法在子類與父類中執行的結果不同。
class A {
function info(){
echo “A INFO”;
}
}
class B extends A {
function info(){
echo “B INFO”;
}
}
class C extends A {
function info(){
echo “C INFO”;
}
}
function printinfo($obj){
function printinfo(A $obj){
if($obj instanceof A)
$obj->info();
$obj->info();
}
}
$a=new A(); $b=new B(); $c=new C();
printinfo($a); //輸出A INFO
printinfo($b); //輸出B INFO
printinfo($c); //輸出C INFO

抽象方法和抽象類

抽象方法是作爲子類摸版使用的。
abstract class Person{
public $name;
abstract function getInfo();
}
抽象類不能被實力話,一個抽象類中,必須有一個抽象方法。但是抽象類中可以定義動態函數。
接口
當一個類繼承了一個接口之後,它要覆蓋接口的所有方法,接口只能聲明常量,接口的方法必須定義爲共有否則無法繼承,接口可以與多個接口間繼承
語法:
interface PCI{
const TYPE="PCI";
//public $name; error
function start();
function stop();
}
接口中的方法可以聲明爲static
interface A{ function a();}
interface B{ function b();}
interface C extends A{ function c();}
class D implements B,C{
function a(){}
function b(){}
function c(){}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章