首頁技術文章正文

PHP面向對象詳解

更新時間:2018-10-12 來源:黑馬程序員技術社區(qū) 瀏覽量:

  面向對象 對象概念是面向對象技術的核心。在顯示世界里我們所面對的事情都是對象,如計算機、電視機、自行車等。在面向對象的程序設計中,對象是一個由信息及對信息進行處理的描述所組成的整體,是對現(xiàn)實世界的抽象.
  對象的主要三個特性
  對象的行為:可以對 對象施加那些操作,開燈,關燈就是行為。
1539339216006_PHP22.jpg  
對象的形態(tài):當施加那些方法是對象如何響應,顏色,尺寸,外型。
  對象的表示:對象的表示就相當于身份證,具體區(qū)分在相同的行為與狀態(tài)下有什么不同。
  面向對象模型
  面向對象的概念:
  oop(面向對象的編程)它能是其代碼更加簡潔易于維護并且具有更強的可重性
  什么是類:
  類是具有相同屬性和服務的一組對象的集合比如說人,書,輪船,車都屬于類,他為屬于該類的對象做了一個統(tǒng)一的抽象描述,在編程的語言中類是一個單獨的程序,它應該有一個類名包括屬性的說明和服務兩個部分。
  什么是對象:
  對象是系統(tǒng)中描述客觀事件的一個實體,他是構成系統(tǒng)的一個基本單位。*數(shù)據(jù)與代碼都被捆綁在一個實體當中*,一個對象由一組屬性和對這組屬性進行操作的一組行為組成。
  從抽象的角度來說,對象是問題域或實現(xiàn)域中某些事物的一個抽象。他反映該事物在系統(tǒng)中保存的信息和發(fā)揮的作用:它是一組屬性和有權對這些屬性進行操作的一個封裝體??陀^世界是由對象和對象之間的聯(lián)系組成的。
  類和對象的關系:
  類與對象的關系就如模具和鑄件的關系,類的實力化的結果就是對象,而對對象的抽象就是類,類描述了一組有相同特性(屬性)和相同行為的對象。
  類與屬性和方法
  PHP中定義類語法格式:
  class classname [可選屬性]{
  public $property [=value];… //用public聲明一個公共標識 然后給予一個變量 變量也可以賦值
  function functionname ( args ){ //類的方法里的成員函數(shù)
  代碼} …
  //類的方法(成員函數(shù))
  }
  生成對象(類的實例化): $對象名=new classname( );
  使用對象的屬性
  在一個類中,可以訪問一個特殊指針$this當在該類中通過一個操作設置或訪問該變量時,使用$this->name來引用.
  對象的生成
  定義好類后用一個new來聲明,由于對象資料的封裝特性,對象是無法由主程序區(qū)塊直接訪問的須通過對象來調(diào)用類中所定義的屬性和行為函數(shù),間接地達成存取控制類中資料的目的。
  對象和類的關系
  對象和類的關系:
  對象是實際存在的,占有動態(tài)資源。
  類是對象的藍圖,可能占有靜態(tài)資源。
  對象屬性占有動態(tài)資源
  類(靜態(tài))屬性實際上是有類名字空間上的“全局變量”
  性能考慮:
  每個對象要單獨占用數(shù)據(jù)空間
  增加的調(diào)用層次可能消耗執(zhí)行時間
  方法的參數(shù)形式和傳遞方式
  方法的參數(shù)可以是基本數(shù)據(jù)類型、數(shù)組和類對象。
  基本數(shù)據(jù)類型:值參傳遞
  數(shù)組:值參傳遞
  類對象:引用傳遞
  構造函數(shù)
  構造函數(shù)是在類中起到初始化的作用
  構造函數(shù)的生成方法與其他函數(shù)一樣只是其名稱必須是__construct().
  語法格式:function __construct(參數(shù)){
  。。。。。。。。
  }
  范例:
  class Person{
  public $name;
  public $sex;
  public $age;
  function __construct($name,$sex,$age){
  echo "我是構造函數(shù)<br>";
  $this->name=$name;
  $this->sex=$sex;
  $this->age=$age;
  }
  輸出結果:初始化
  析構函數(shù)
  當對象脫離其作用域時(例如對象所在的函數(shù)已調(diào)用完畢),系統(tǒng)自動執(zhí)行析構函數(shù)。應在退出前在析構函數(shù)中用釋放內(nèi)存。
  析構函數(shù)__destruct 析構函數(shù)沒有任何參數(shù)
  范例:
  class person{
  function _ _destruct( )
  { echo "bye bye !“; }
  }
  $a=new person();
  訪問類型
  public 公共的(公共修飾符) 類內(nèi)部與類外部都可以訪問的
  private 私有的(私有修飾符) 只能在類內(nèi)部訪問
  protected 受保護的(保護成員修飾符) 子類可以訪問 類外部不可以訪問
  oop的三個重要特性
  封裝,繼承,多態(tài)
  封裝性:封裝性就是把對象的屬性和行為結合成一個獨立的單位。
  封裝一個類需要兩步 第一步是私有化一個類 第二步是用set和get 做出讀取賦值的操作
  他的好處是:隱藏類的實現(xiàn)細節(jié),可以方便加入邏輯控制性,限制對屬性的不合理操作,便于修改增強代碼的可維護性。
  __get與__set
  一般說把類私有話更符合現(xiàn)實的邏輯。
  預定義兩種函數(shù)來進行獲取與敷值操作。
  __get 獲取值通常是域的值
  __set 設置值通常是域的值
  __call 調(diào)用一個對象中不存在的方法時,就會產(chǎn)生錯誤call()這個方法來處理這種情況。
  靜態(tài)屬性和方法
  static關鍵字 來聲明靜態(tài)方法
  static靜態(tài)變量 在類的內(nèi)部生成一個靜態(tài)變量 就是能夠被所有類的實力化共想 也就是說靜態(tài)成員則放到了“初始化靜態(tài)段”,在類第一次被加載的時候放入的,可以讓堆內(nèi)存里面的每個對象所共享
  使用方法:self::$靜態(tài)屬性、self::靜態(tài)方法
  static function p(){
  echo self::$country;
  echo self::PI;//訪問常量
  //echo $this->name;在靜態(tài)方法中只能操作靜態(tài)屬性
  //self::p();
  }
  外部調(diào)用:類::$靜態(tài)屬性、類::靜態(tài)方法
  const關鍵字:用來生成常量 常量是唯一的不能改變的 慣例常量為大寫
  const CONSTANT = 'constant value'; 生成一個常量
  echo self::CONSTANT;//類內(nèi)部訪問
  echo ClassName::CONSTANT;//類外部訪問
  繼承性
  B類的對象擁有A類的全部屬性與行為,稱作B對A類的繼承。
  假如一個類從多個類中繼承了屬性與服務,這稱為多繼承,通常我們成為繼承類為子類被繼承類為父類,在PHP中只有單繼承,但一個父類可以被多個類繼承,但是一個子類只能有一個父類,但是允許關聯(lián)繼承,通過繼承可以減化類的定義。
  extende聲明繼承關系
  語法格式:class B extends A 此范例指明 B繼承了A
  類的外部訪問對子類是有效的
  子類與父類的屬性與方法
  子類繼承父類的所有內(nèi)容,但父類中的private部分不能直接訪問
  子類中新增加的屬性和方法是對父類的擴展
  子類中定義的與父類同名的屬性是對父類屬性的覆蓋,同名的方法也是對父類方法的覆蓋
  重寫的方法
  在子類中,使用parent訪問父類中的被覆蓋的屬性和方法
  parent::__construce();
  parent::$name;
  parent::fun();
  覆蓋父類原有屬性
  clone克窿對象 語法格式$c=clone $p; $c克窿的對象$p 輸出echo $c->name;
  對象比較
  ===兩個比較運算符。
  ==是比較兩個對象的內(nèi)容。
  ===是比較對象的句柄,即引用地址。
  instanceof操作符用于檢測對象實力是否屬于某一個類的類型 屬于返回true 不屬于返回false
  __clone()如果想在克隆后改變原對象的內(nèi)容,需要在__clone()中重寫原本的屬性和方法
  function __clone(){
  $this->name="我是一個克隆人";
  }
  final表示一個類是最終版本 也就是說它不能在被子類調(diào)用
  多態(tài)性
  多態(tài)性是指在父類中定義的屬性或行為被子類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個屬性或行為在父類及其各個子類中具有不同的語義。
  就是說同一種方法在子類與父類中執(zhí)行的結果不同。
  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();
  }
  抽象類不能被實力話,一個抽象類中,必須有一個抽象方法。但是抽象類中可以定義動態(tài)函數(shù)。
  接口
  當一個類繼承了一個接口之后,它要覆蓋接口的所有方法,接口只能聲明常量,接口的方法必須定義為共有否則無法繼承,接口可以與多個接口間繼承
  語法:
  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(){}
  }

本文版權歸黑馬程序員PHP+H5全棧工程師培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!

作者:黑馬程序員PHP+H5全棧工程師培訓學院
首發(fā):http://web.itheima.com/?v2

分享到:
在線咨詢 我要報名
和我們在線交談!