推薦學習:《》
實踐學習php,thinkphp,Redis,vue,uni-app等技術,推薦開源電商系統likeshop,可以借鑑思路,可去版權免費商用,gitee下載地址:
點選進專案地址
物件導向:OOP(objected oriented programming)程式設計
程式導向是一種程式設計思想
物件導向程式設計的本質是增加資料和功能的操作主體,即物件
物件導向中的所有的資料和功能多是由主體(物件)來呼叫和操作
程式導向和物件導向區別
建立物件
<?phpclass People{}$man=new People();# 範例化類,man就是物件var_dump($man);?> # 輸出object(People)#1 (0) { } #1表示:物件編號,與類無關,是整個指令碼中物件的序號(0)表示:成員變數(屬性)個數{}表示:具體成員變數資訊(鍵值對)
<?phpclass Buyer{ # 常數宣告 const BIG_NAME='BUYER'; # 常數不需要加 $ # 屬性宣告 # $name; # 錯誤的,類內部屬性必須使用存取修飾限定符 public $name; public $money=0; # 方法宣告 function display(){ echo __CLASS__; # 魔術常數,輸出類名 # 方法內部變數屬於區域性變數 }}# 範例化$a = new Buyer();# 屬性操作,增刪改查echo $a->money;$a->money='20';$a->sex='male';unset($a->name);echo '<br>';# 方法操作$a->display();echo '<br>';var_dump($a);?> # 輸出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" }
注意:類常數不是由物件來進行存取
在屬性或者方法前的修飾關鍵字,用來控制屬性或者方法的存取位置
屬性必須有存取修飾限定符,方法可以沒有存取修飾限定符,預設就是 public
$this,方法內部內建的一個物件,會自動指向來呼叫的方法的物件
$this 存在於方法內部(僅限內部使用),所以相當於在類的結構內部
<?phpclass Article{ protected $name = 'a'; private $type = 'art'; public function get_name() { var_dump($this); }}$a = new Article();var_dump($a);?> # 輸出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" }
$this 代表的是物件,而 $this 所在環境為類內部的方法內部,所以 $this 物件是在類內部存取,因此所有的屬性和方法,不受存取修飾限定符限制
__construct() 是一種系統內建的魔術方法,該方法的特性是在物件範例化之後,物件立即自動呼叫
構造方法的目的就是為了初始化資源,包括物件屬性和其他資源
一旦構造方法定義好後,且構造方法自帶引數,那麼就只能使用 new 類名(參數列) 方式才能正確範例化
魔術方法也可以通過物件直接呼叫的方式呼叫,不過沒有實際用處
<?phpclass Article{ public $name='xiaoli'; private $sex="male"; public function __construct($name,$sex) { $this->name = $name; $this->sex = $sex; }}$a = new Article('xiaowang', 'famale');var_dump($a);?>
<?phpclass Article{ protected $name = 'xiaoli'; private $sex = 'famale'; public function __destruct() { // TODO: Implement __destruct() method. echo __FUNCTION__; }}$a=new Article();# 銷燬物件$a=1;unset($a);# __destructendecho 'end';?> # 不銷燬物件,php在執行結束也會釋放資源# end__destruct
定義:將儲存物件的變數賦值給另外一個變數
在 PHP 中,物件的傳值是參照傳遞:即一個物件變數賦值給另外一個變數,兩個變數指向同一個物件地址,即只有一個物件
<?phpclass Article{ public $name = 'xiaoli'; public $sex = 'famale';}$a=new Article();$b=$a;var_dump($a,$b);echo '<br>';$a->name="wangxiaohu";var_dump($a,$b);echo '<br>';?> # 輸出object(Article)#1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" } object(Article) #1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" }object(Article) #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } object(Article) #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" }
有兩個冒號組成 「::」 ,專門用於類實現類成員操作,可以實現類直接存取類成員
範圍解析操作符是用於給類(類名)存取類成員使用的
類名::類成員
範圍解析操作符也可以被物件用來當作類使用(不建議)
$物件名::類成員
類常數只能被類存取
<?phpclass Article{ const NAME='ocean';}echo Article::NAME; # 常數是不能通過 Article->NAME 來進行存取的$a=new Article();echo $a::NAME; # 範圍解析操作符相容物件,找到物件所屬類最終進行存取,效率降低,靈活性提高?>
類常數是固定的,而物件的屬性是不同物件不同的
定義:使用 static 關鍵字修飾的類成員,表示該成員屬於類存取
<?phpclass Article{ public static $name = 'hlm'; public static $type = 'art'; public static function getName() { return self::$name; }}# 靜態屬性$a = new Article();echo Article::$name;# 靜態方法echo Article::getName();?>
<?phpclass Article{ public static function getInstance1() { return new self(); } public static function getInstance2() { return new Article(); }}$a = Article::getInstance1();$b = Article::getInstance2();var_dump($a,$b);?> # 輸出object(Article) #1 (0) { } object(Article) #2 (0) { }
類的存取必須保證類在記憶體中已經存在,所以需要再用類之前將類所在的 PHP 檔案載入到記憶體中
類的載入分為兩種
自動載入兩種方式
function __autoload($classname){ # 找到對應的檔案路徑和命名規範,手動載入}
# 自定義類載入函數function 自定義函數($classname){ # 找到對應的檔案和命名規範,手動載入}#註冊自動載入sql_autoload_register('自定義函數名字')
自動載入要求在宣告類的時候有良好的規範
例:手動載入
Article.php
<?phpclass Article{ public function getName(){ return __METHOD__; }}
mian.php
<?php# include 'Article.php';# 直接載入比較消耗資源,而且如果類已經在記憶體中存在,直接include會報錯,建議判斷後再載入if(!class_exists('Article')){ include 'Article.php';}$a=new Article();var_dump($a->getName()); # outputstring(16) "Article::getName"
自動載入
一個系統中,可能類檔案會放到不同的路徑下,因此一個完整的自動載入函數,應該要進行檔案判定功能
<?php function __autoload($classname){ # 形參代指 類名 #組織檔案路徑,假設當前路徑下,有兩個資料夾下都有類c和類m $c_file = 'c/' . $classname . '.php'; if (file_exists($c_file)) { include_once($c_file); return true; } //if 語句如果只有一行不需要加 {} //include_once 只載入一次 $m_file = 'm/' . $classname . '.php'; if (file_exists($m_file)) { include_once($m_file); return true; } } $a=new Article(); $b=new Article();
<?phpfunction autoload01($classname){ if(!class_exists($classname)){ $file_name=$classname.'.php'; if(file_exists($file_name)) include_once $file_name; }}spl_autoload_register('autoload01');$a=new Article();
通過已有的物件複製一個新的同樣的物件,但兩者之間並非同一個物件
封裝、繼承、多型
類的封裝
類的繼承
inherit,子類合法擁有父類別的某些許可權
子類也稱派生類
父類別也稱基礎類別
# 父類別class Human{}# 子類繼承class Man extends Human{}
類的多型
多型性是指相同的操作或函數、過程可作用於多種型別的物件上並獲得不同的結果
<?phpclass Human{ public function show(){ echo __METHOD__; }}class Man extends Human{}$m=new Man;$m->show();
有限繼承
子類在繼承父類別的成員時,並非繼承所有內容,而是繼承並使用父類別部分內容
override,子類中定義了與父類別重名的成員
一種明確存取父類別成員的表達方式
方法被重寫後,存取呼叫的是子類方法,如果想要存取父類別方法,可以通過在子類方法中使用 parent 來強制存取父類別方法
parent 不能用於存取父類別的屬性(靜態屬性可以)
使用 final 關鍵字修飾類名,表示此類不可以被繼承
final 關鍵字還能修飾方法,表示方法不能被重寫(通常此時類不會使用 final 關鍵字)
使用 abstract 關鍵字修飾的類,表示該類只能被繼承,不能被範例化
abstract 關鍵字可以修飾方法,表示方法為抽象方法,抽象方法沒有方法體(沒有{})
抽象方法存在的類必須為抽象類
繼承抽象類的類要麼為抽象類,要麼實現抽象類裡所有的抽象方法
適用於,不同類之間有公共程式碼,但是類彼此關係不存在繼承關係,此時可以將公共程式碼儲存到 trait 中
trait 內部可以擁有一個類能擁有的成員屬性(包括靜態),成員方法(包括靜態和抽象方法),但不能有類常數
trait 用來程式碼複用,不能被範例化,不能被繼承
一個類中可能需要引入多個 trait ,而不同 trait 中可能出現同名
Interface,專門用來規範一些共性類必須實現的方法
interface 介面名字{}
class 類名 implements 介面名字{}
介面成員
介面成員只能有兩類
overload,指在一個類中可以出現多個同名方法,彼此之間的引數個數和型別不一樣
用來容錯
屬性過載
當物件存取不存在的或者許可權不夠的屬性的時候,自動觸發魔術方法讓程式碼不出錯
屬性過載魔術方法
方法過載
物件或者類存取不存在或者許可權不夠的方法,自動觸發的魔術方法讓程式碼不出錯
將物件中的所有屬性以鍵值對的形式取出並進行存取
物件是一種複合資料型別,物件中真正儲存的內容是屬性
物件的屬性本質也是一種鍵值對關係:名字 = 值
物件遍歷就是利用 foreach 對物件中的屬性進行取出解析
物件遍歷遵循存取修飾限定符的限定:即類外只能遍歷所有共有屬性
foreach(物件變數 as [屬性名變數 =>] 屬性值變數){ #屬性名變數代表取出的每個屬性的名字 #屬性值變數代表取出的每個屬性的值}
yield 關鍵字
design pattern,是軟體開發人員在軟體開發過程中問題的解決方法
單例模式
singleton,是一種類的設計只會最多產生一個物件的設計思想
保證資源唯一性
工廠模式
。。。。。。
namespace,指人為的將記憶體進行分隔,讓不同記憶體區域的同名結構共存,從而解決在大型專案能出現重名結構問題
基礎語法:
namespace 關鍵字定義空間
命名規則
字母、數位、下劃線,不能以數位開頭
名稱空間必須寫在所有程式碼之前,定義了一個,之後可以定義多個
子空間
subspace,即在已有空間之上,再在內部進行空間劃分
子空間直接通過 namespace+路徑符號 \ 實現
非限定名稱
直接存取元素本身,代表當前所屬空間(當前目錄)
限定名稱
使用空間名+原名,代表存取當前空間子空間(當前目錄子目錄)
完全限定名稱
從根目錄(全域性空間)開始存取,使用 \ 作為全域性空間開始符號(根目錄)
全域性空間元素存取:使用完全限定名稱存取
名稱空間引入
推薦學習:《》
以上就是歸納總結PHP物件基礎的詳細內容,更多請關注TW511.COM其它相關文章!