面向對象學習筆記整理

面向對象學習筆記整理php

對象類型在內存中的分配

1:內存結構mysql

棧空間段(後進先出):空間小被CPU訪問速度快,用於存放程序中的臨時變量,方便用於保存和恢復調用現場,主要存放佔用空間小的數據類型(整型,bool型)linux

堆空間段(先進先出):存放程序運行中動態分配的內存段,存儲佔用空間較大的數據類型(數組,資源,對象)git

數據段:存儲已經初始化的全局變量,換句話就是說存儲靜態分佈的變量。github

代碼段:代碼段須要在運行時防止被非法修改,值容許讀取操做。(函數)sql

  • $student = new Person();

a:實例化對象$student存儲在棧內存段中數據庫

b:類Person存儲在堆內存apache


2:使用final標識的類不能被繼承;在類中使用final標識的成員方法,在子類方法不能被覆蓋。編程

3:類的靜態屬性相似於全局變量設計模式

訪問方式1 類名:靜態成員屬性/方法名

訪問方式2 self: 靜態成員屬性/方法名

4:單態設計模式是指在OOP中一個類只能有一個實例對象存在。

5:將類中的成員屬性定義爲常量,只能使用const關鍵字,在類中聲明爲常量的屬性爲只讀不能從新賦值。常量在聲明時必定要賦初值。訪問經過self

6:在PHP中,同一個類中只能聲明一個構造方法,默認是public訪問

7:析構方法是在對象唄銷燬前最後調用的一個方法。當堆內存中的對象失去訪問它的引用時,就不可再被訪問。析構方法不能帶有任何參數

8:魔術方法__set()的做用是在程序運行過程當中爲私有屬性設置值,不須要返回值。該方法須要兩個參數,$propertyName與$propertyValue,分別對應屬性名譽屬性值。代碼詳見__set.php

9:魔術方法__get()的做用是程序在執行過程當中,經過這個魔術方法獲取私有屬性的值。該方法須要一個必填參數$propertyName,該方法執行結果會返回一個值。代碼詳見__get.php

10:魔術方法__isset() 方法用於檢測私有屬性值是否被設定。 若是對象裏面成員是公有的,能夠直接使用 isset() 函數。若是是私有的成員屬性,那就須要在類裏面加上一個 __isset() 方法。代碼詳見__isset.php

11:魔術方法__unset() 方法用於刪除私有屬性。 若是對象裏面成員屬性是公有的,能夠直接使用unset() 函數。若是是私有的成員屬性,那就須要在類裏面加上一個 __unset() 方法。

12:OOP中訪問控制符的區別

範圍 public protected private
本類 Y Y Y
子類 Y Y N
外部 Y N N

在類繼承中能夠對 public 和 protected 進行重定義,但 private 而不能

13:OOP中final關鍵字的使用

final關鍵字能夠加在類名前或是類中的方法名前,類中的成員屬性不能使用final。

使用final標識的類名不能被繼承。

使用final標識的方法不能被重寫。

14:OOP中static關鍵字使用

使用static關鍵字能夠將類中的成員屬性與成員方法標識爲靜態,表示惟一存在。

類中的靜態成員使用類名直接訪問。

在類中的成員方法中,可使用self關鍵字來訪問其它靜態成員。//靜態成員屬於類而不屬於對象因此不用$this。

示例代碼static.php

14:單態設計模式--一個類只能存在一份對象

15:CONST關鍵字--面向對象中常量的定義,只讀,類中成員方法可使用self來訪問,外部訪問時className::常量名

16:instanceof判斷一個對象是不是某個類的實例化

17:對象克隆Clone

根據現有的對象克隆出一個一幕同樣的對象,原對象和克隆的對象徹底一致,兩者相互對立,互不影響。

<?php

  class Program{
    private $os;
    private $server;
    private $language;
    private $database;

    public function __construct($os="linux", $server="apache", $language="php", $database="MongoDB"){
      $this->os = $os;
      $this->server   =$server;
      $this->language =$language;
      $this->database =$database;
    }

    public function info(){
      echo "操做系統:".$this->os."<br/>";
      echo "Web服務器:".$this->server."<br/>";
      echo "編程語言:".$this->language."<br/>";
      echo "數據庫軟件:".$this->database."<hr/>";
    }

  }

  $coder1 = new Program("Ubuntu");
  $coder2 = Clone $coder1;
  $coder2->info();
?>

若是須要對克隆後的副本成員屬性從新賦值,可使用魔術方法__clone,該方法不須要任何參數,該方法包含了$this與$that兩個對象的引用。其中$this是clone對象的引用,$that是原始對象的引用。

<?php

  class Program{
    private $os;
    private $server;
    private $language;
    private $database;

    public function __construct($os="linux", $server="apache", $language="php", $database="MongoDB"){
      $this->os = $os;
      $this->server   =$server;
      $this->language =$language;
      $this->database =$database;
    }

    public function __clone(){
      $this->language = "如今已將語言由".@$this->language."替換爲Python";
    }

    public function info(){
      echo "操做系統:".$this->os."<br/>";
      echo "Web服務器:".$this->server."<br/>";
      echo "編程語言:".$this->language."<br/>";
      echo "數據庫軟件:".$this->database."<hr/>";
    }

  }

  $coder1 = new Program("Ubuntu");
  $coder2 = Clone $coder1;
  $coder2->info();
?>

18:魔術方法__String()

魔術方法__toString() 方法用於一個類被當成字符串時應怎樣迴應。例如 echo $obj; 應該顯示些什麼。此方法必須返回一個字符串,不然將發出一條 E_RECOVERABLE_ERROR 級別的致命錯誤。

<?php
  class  Program{
     public $language;

     public function __construct($language,$database="mysql"){
       $this->language = $language;
       $this->database = $database;
     }

     public function __toString(){
       return $this->language."-".$this->database;
     }
  }

  $code = new Program("PHP");
  echo $code;    //這裏自動調用魔術方法__toString()
?>

19:OOP中訪問一個不存在的方法時若是不出意外是會報錯的,要怎樣才能讓他不報錯呢?下面魔術方法__Call()。在調用對象中不存在的方法時會自動調用該方法。該方法須要兩個參數$propertyName和$args。代碼示例以下。

<?php

class Person{

  public $language;
  public $database;

  public function __construct($language="php", $database="mysql"){
    $this->language = $language;
    $this->database = $database;
  }

  public function __Call($propertyName, $args){
    echo "你調用的方法是".$propertyName."<br/>";
    echo "方法的參數是<pre>";
    print_r($args);
    echo "<br/>不過該方法並不存在!";
  }
}

$code = new Person;
$code->info("php","linux");

 ?>

20:類的自動調用

//autoload.php
<?php

  function __autoload($className){
    include(strtolower($className).".class.php");
  }

  $dd = new name();   //自動調用到name.class
  $dd ->getInfo();    //output 雨醉風塵
?>
```
```
//name.class.php
<?php
  class name{
    public function getInfo(){
      echo "雨醉風塵";
    }
  }
 ?>
```

22:對象的串行化serialize()與反串行化unserialize()
```
<?php

class Person{
  private $name;
  private $age;
  private $sex;

  function __construct($name="User", $age=20, $sex="男"){
    $this->name = $name;
    $this->age  = $age;
    $this->sex  = $sex;
  }

  public function info(){
    echo "這是".$this->name."的我的信息<br/>";
    echo "年齡:".$this->age."<br/>";
    echo "性別:".$this->sex."<br/>";
  }
}

$dd = new Person("雨醉風塵",22);
$dd_string = serialize($dd);
echo $dd_string;
//O:6:"Person":3:{s:12:"Personname";s:12:"雨醉風塵";s:11:"Personage";i:22;s:11:"Personsex";s:3:"男";}
echo "<hr/>";

$dd_un = unserialize($dd_string);
$dd_un->info();   

 ?>

```
23:抽象方法是指沒有方法體的方法,聲明一個方法爲抽象方法時,使用關鍵字abstract修飾。舉例**abstract function test();**

24:抽象類是指包含抽象方法的類,不能被直接實例化,經過繼承實現抽象類中的抽象方法。子類繼承抽象類後必須所有實現抽象類中的抽象方法。

25:接口是指抽象類中全部的方法都是抽象方法的類,用interface修飾,接口中的方法能夠不適用abstract修飾。接口的實現使用關鍵字implements

26:接口中定義的全部方法都必須是公有,這是接口的特性。

27:類能夠實現多個接口,用逗號來分隔多個接口的名稱。
相關文章
相關標籤/搜索