首頁 後端開發 Python教學 PHP物件導向三大特色學習

PHP物件導向三大特色學習

Apr 08, 2018 pm 12:30 PM
php 學習 特點

PHP物件導向三大特徵學習學習目標:充分理解抽象、封裝、繼承、多型

面象對向的三大特點:封裝性、繼承性、多態性首先簡單理解一下抽象:
我們在前面定義一個類別的時候,實際上就是把一類事物共有的屬性和行為提取出來,形成一個物理模型(模版),這種研究問題的方法稱為抽象
PHP物件導向三大特色學習
一、封裝性
封裝就是把抽取出來的資料和對資料的操作封裝在一起,資料被保護在內部,程式的其他部分只有被授權的操作(方法)才能對資料進行操作。
php提供了三種存取控制修飾符
public 表示全域,本類別內部,類別外部,子類別都可以存取
protected 表示受保護的,只有本類別或子類別可以存取
private 表示私有的,只有本類內部可以存取
以上三種修飾符既可以修飾方法也可以修飾屬性(變數),方法如果沒有存取修飾符則預設為public,成員屬性必須指定存取修飾符,在PHP4中也有這種寫法var $name,表示公開屬性,不推薦這種寫法
例:

複製程式碼 程式碼如下:

<?php 
class Person{ 
public $name; 
protected $age; 
private $salary; 
function __construct($name,$age,$salary){ 
$this->name=$name; 
$this->age=$age; 
$this->salary=$salary; 
} 
public function showinfo(){ 
//这表示三个修饰符都可以在本类内部使用 
echo $this->name."||".$this->age."||".$this->salary; 
} 
} 
$p1=new Person(&#39;张三&#39;,20,3000); 
//这里属于类外部,那么如果用下面的方法访问age和salary都会报错 
// echo $p1->age; echo$p1->salary; 
?>
登入後複製

那麼現在就想在外部存取protected和private的元素和方法該怎麼辦? 通常做法是透過public函數去存取這些變數格式:
public function setxxxx($val){
$this->xxxx=$val;
}
public function getxxxx(){
return $this->xxxx;
}
這裡帶set和get只是為了識別方便,並非必要
如:
public function getsalary(){
return $this- >salary; //擴充:這裡可以呼叫一些方法,如判斷使用者名稱等,正確才給存取
}
在外部就可以透過echo $p1->getsalary();
如果要存取protected和private也可以使用下列方法,但不建議使用,只要了解即可
__set() 和__get()
__set()對protected或private屬性進行賦值操作
__set( $name,$val);
__get()取得protected 或private的值
__get($name);
如:

複製程式碼程式碼如下:

<?php 
class testa{ 
protected $name; 
//使用__set()来管理所有属性 
public function __set($pro_name,$pro_val){ 
//上面$pro_name和$pro_val可自定义 
//下面$this->pro_name为既定,不可更改 
$this->pro_name=$pro_val; 
} 
//使用__get()来获取所有属性值 
public function __get($pro_name){ 
if(isset($pro_name)){ 
return $this->pro_name; 
} else { 
return null; 
} 
} 
} 
$n1=new testa(); 
//正常情况,类外部是不能访问protected属性的,但是用了上面的方法就可以对它们进行操作 
$n1->name=&#39;小三&#39;; 
echo $n1->name; 
?>
登入後複製

//以上程式碼看懂就行,不建議使用
二、繼承性
先看一個範例:

複製程式碼 程式碼如下:

<?php 
class Pupil{ 
public $name; 
protected $age; 
public function getinfo(){ 
echo $this->name.&#39;||&#39;.$this->age; 
} 
public function testing(){ 
echo &#39;this is pupil&#39;; 
} 
} 
class Graduate{ 
public $name; 
protected $age; 
public function getinfo(){ 
echo $this->name.&#39;||&#39;.$this->age; 
} 
public function testing(){ 
echo &#39;this is Graduate&#39;; 
} 
} 
?>
登入後複製


從上面的範例可以看出,當多個類別有很多共同屬性和方法時,程式碼的複用性不高,程式碼冗餘,思考css中的處理方法
解決方法:繼承

複製程式碼 程式碼如下:

<?php 
class Students{ 
public $name; 
public $age; 
public function __construct($name,$age){ 
$this->name=$name; 
$this->age=$age; 
} 
public function showinfo(){ 
echo $this->name.&#39;||&#39;.$this->age; 
} 
} 
class Pupil extends Students{ 
function testing(){ 
echo &#39;Pupil &#39;.$this->name.&#39; is testing&#39;; 
} 
} 
class Graduate extends Students{ 
function testing(){ 
echo &#39;Graduate &#39;.$this->name.&#39; is testing&#39;; 
} 
} 
$stu1=new Pupil(&#39;张三&#39;,20); 
$stu1->showinfo(); 
echo &#39;<br/>&#39;; 
$stu1->testing(); 
?>
登入後複製

從上面可以看出,繼承就是一個子類別(Subclass)透過extends 父類別把父類別(BaseClass)中的public 和protected 的屬性和方法繼續下來,不能繼承private屬性和方法
語法結構:
class 父類別名稱{ }
class 子類別名稱extends 父類別名稱{}
細節:
1、一個子類別只能繼承一個父類別(這裡指直接繼承);如果希望繼承多個類別的屬性和方法,可以使用多層繼承
範例:

複製程式碼 程式碼如下:

<?php 
class A{ 
public $name=&#39;AAA&#39;; 
} 
class B extends A{ 
public $age=30; 
} 
class C extends B{} 
$p=new C(); 
echo $p->name;//这里会输出AAA 
?>
登入後複製

2、在建立某個子類別物件時,預設情況下方不會自動呼叫其父類別的建構子
範例:
class A{
public function __construct(){
echo 'A';
}
}
class B extends A{
public function __construct(){
echo 'B';
}
}
$b=new B();//這裡會優先輸出B中的建構方法,如果B中沒有建構方法才會輸出A中的
3、在子類別中如果需要存取父類別的方法(建構方法、成員方法方法的修飾符為protected或private),那麼可以使用父類別::方法名稱或parent::方法名稱完成【這裡parent和先前提到的self都都是小寫,大寫報錯】
class A{
public function test(){
echo 'a_test';
}
}
class B extends A{
public function __construct(){
//兩種方法都行
A::test();
parent::test();
}
}
$b=new B();
5、如果一個子類別(衍生類別)的方法與父類別的方法完全一樣時(public,protected),我們稱為方法覆蓋或方法重寫(override),看下面的多態性
三、多態性
例:

複製程式碼 程式碼如下:

<?php 
class Animal{ 
public $name; 
public $price; 
function cry(){ 
echo &#39;i don\&#39;t know&#39;; 
} 
} 
class Dog extends Animal{ 
//覆盖、重写 
function cry(){ 
echo &#39;Wang Wang!&#39;; 
Animal::cry();//这里不会报错,能正确执行父类的cry(); 
} 
} 
$dog1=new Dog(); 
$dog1->cry(); 
?>
登入後複製


小结:
1、当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法如何写,可以让子类去覆盖它的方法,方法覆盖(重写),必须要求子类的方法名和参数个数完全一致
2、如果子类要去调用父类的某个方法(protected/public),可以使用 父类名::方法名 或者 parent::方法名
3、在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限(即不能缩小父类方法的访问权限)
如 父类public function cry(){} 子类 protected function cry(){} 则会报错
但是子类的访问权限可以放大,如:
父类private function cry(){} 子类 protected function cry(){} 可以正确执行
扩展:
方法重载(overload)
基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数
在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数
PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载,
这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call
【官方不推荐使用】
PHP中有以下几个魔术常量:__LINE__ __FILE__ __DIR__ __FUNCTION__ __CLASS__ 等
例:

复制代码 代码如下:

<?php 
class A{ 
function test1($p){ 
echo &#39;test1<br/>&#39;; 
} 
function test2($p){ 
echo &#39;test2<br/>&#39;; 
} 
function __call($method,$p){ 
//这里$p为数组,上面两个变量名可自定义 
if($method == &#39;test&#39;){ 
if(count($p)==1){ 
$this->test1($p); 
} else if(count($p)==2){ 
$this->test2($p); 
} 
} 
} 
} 
$a=new A(); 
$a->test(5); 
$a->test(3,5); 
?>
登入後複製

相关推荐:

PHP面向对象五大原则之依赖倒置原则(DIP)详解_php技巧

PHP面向对象五大原则之里氏替换原则(LSP)详解

PHP面向对象五大原则之开放-封闭原则(OCP)详解

以上是PHP物件導向三大特色學習的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

See all articles