面向對象學習筆記整理php
1:內存結構mysql
棧空間段(後進先出):空間小被CPU訪問速度快,用於存放程序中的臨時變量,方便用於保存和恢復調用現場,主要存放佔用空間小的數據類型(整型,bool型)linux
堆空間段(先進先出):存放程序運行中動態分配的內存段,存儲佔用空間較大的數據類型(數組,資源,對象)git
數據段:存儲已經初始化的全局變量,換句話就是說存儲靜態分佈的變量。github
代碼段:代碼段須要在運行時防止被非法修改,值容許讀取操做。(函數)sql
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:類能夠實現多個接口,用逗號來分隔多個接口的名稱。