首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 面向對象核心知識體系總結:繼承、魔術方法、介面、屬性與進階特性

     編輯:PHP 相關知識

PHP 面向對象程式設計(OOP)是構建可維護、可擴充大型應用的基石。本文系統梳理 PHP OOP 核心知識點,涵蓋類繼承、可見性控制、靜態綁定、魔術方法、建構子/解構子、final 關鍵字、介面契約、屬性重載、對象克隆等進階特性,並附帶可直接運行的代碼範例。

1. 類繼承與方法重載

使用 extends 關鍵字實現繼承。子類自動擁有父類的 public 與 protected 成員,可新增或覆蓋(重載)同名方法。

<?php
class A {
    public function foo() { echo "A::foo\n"; }
    protected function bar() { echo "A::bar\n"; }
    private function baz() { echo "A::baz\n"; } // 子類不可見
}

class B extends A {
    public function foo() { echo "B::foo\n"; } // 重載
    public function test() {
        $this->foo();  // B::foo
        $this->bar();  // A::bar (受保護可繼承)
        // $this->baz(); // Fatal Error: 私有不可訪問
    }
}

$b = new B();
$b->foo();  // B::foo
$b->test();
?>

2. 可見性修飾符:public / protected / private

修飾符類內部子類外部代碼
public✅✅✅
protected✅✅❌
private✅❌❌

最佳實踐:屬性預設 private,透過 getter/setter 或魔術方法 __get/__set 控制存取;需子類覆蓋的方法用 protected。

3. 雙冒號 :: 作用域解析操作符

用於存取靜態成員、類常量、覆蓋父類方法、延遲靜態綁定。

<?php
class MyClass {
    const CONST_VALUE = '常量值';
    public static $staticVar = '靜態屬性';
    public static function staticMethod() { echo "靜態方法\n"; }
}

echo MyClass::CONST_VALUE;      // 常量
echo MyClass::$staticVar;       // 靜態屬性
MyClass::staticMethod();        // 靜態方法

// 子類覆蓋父類並調用父實現
class ParentClass {
    protected function greet() { echo "Parent\n"; }
}
class ChildClass extends ParentClass {
    public function greet() {
        parent::greet(); // 調用父類實現
        echo "Child\n";
    }
}
(new ChildClass())->greet();
?>

4. $this、self、parent 三者區別

關鍵字指向可存取典型用途
$this當前對象實例實例屬性/方法非靜態上下文
self當前類(編譯期綁定)靜態成員、常量類內部調用靜態成員
parent父類父類靜態/受保護成員調用父類建構子、被覆蓋方法
<?php
class Counter {
    private static $count = 0;
    private $id;
    public function __construct() {
        $this->id = ++self::$count; // self:: 存取靜態屬性
    }
    public function getId() { return $this->id; }
}

class SubCounter extends Counter {
    public function __construct() {
        parent::__construct(); // 必須顯式調用父建構子
    }
}
?>

5. 建構子 __construct 與解構子 __destruct

  • 建構子:實例化時自動調用,用於初始化。子類定義建構子會覆蓋父類,需手動 parent::__construct()。
  • 解構子:對象無引用或腳本結束前調用,用於釋放資源(關閉連線、釋放鎖、寫入日志)。
  • exit()/die() 會觸發解構子,但在解構子中再次調用 exit() 會中止後續關閉操作。

6. final 關鍵字

  • final 修飾方法 → 禁止子類覆蓋
  • final 修飾類 → 禁止被繼承
<?php
final class SecurityUtils {
    public static function hash($data) { return hash('sha256', $data); }
}
// class Hack extends SecurityUtils {} // Fatal Error
?>

7. 介面 interface:定義行為契約

  • 介面中所有方法隱性為 public abstract
  • 類可 implements 多個介面,方法名不可重複
  • 介面可 extends 多個父介面
  • 介面常量同類常量,不可被覆蓋
<?php
interface iTemplate {
    public function setVariable($name, $var);
    public function getHtml($template);
}

class Template implements iTemplate {
    private $vars = [];
    public function setVariable($name, $var) { $this->vars[$name] = $var; }
    public function getHtml($template) {
        foreach ($this->vars as $k => $v) {
            $template = str_replace('{'.$k.'}', $v, $template);
        }
        return $template;
    }
}
?>

8. 屬性重載:__get、__set、__isset、__unset

當存取 不可見(不存在、private、protected)屬性時自動觸發。注意:這些魔術方法必須聲明為 public,否則外部調用會報錯。

<?php
class Person {
    private $data = [];
    public function __set($name, $value) { $this->data[$name] = $value; }
    public function __get($name) { return $this->data[$name] ?? null; }
    public function __isset($name) { return isset($this->data[$name]); }
    public function __unset($name) { unset($this->data[$name]); }
}

$p = new Person();
$p->name = '張三';     // 觸發 __set
echo $p->name;         // 觸發 __get → 張三
var_dump(isset($p->name)); // 觸發 __isset → true
unset($p->name);       // 觸發 __unset
echo $p->name;         // null
?>

9. 對象克隆 clone 與 __clone()

  • 預設為淺拷貝:引用類型屬性(對象、資源)仍指向同一記憶體
  • 定義 __clone() 可在克隆後執行深拷貝邏輯
<?php
class Address { public $city; }
class User {
    public $name;
    public $address;
    public function __clone() {
        $this->address = clone $this->address; // 深拷貝地址對象
    }
}
$u1 = new User();
$u1->name = 'A';
$u1->address = new Address();
$u1->address->city = '北京';

$u2 = clone $u1;
$u2->address->city = '上海';
echo $u1->address->city; // 北京(深拷貝生效)
?>

10. 實用設計模式速查

模式PHP 關鍵實現適用場景
單例private __construct + static getInstance()資料庫連線、配置管理
工廠static create() 返回介面實現多驅動切換(快取、日志、支付)
觀察者SplObserver / SplSubject事件系統、解耦業務邏輯
策略介面 + 多實現 + 上下文注入演算法熱插拔(排序、壓縮、加密)

總結

掌握 PHP OOP 核心機制,能寫出高內聚、低耦合、易測試的代碼。建議:

  1. 優先使用 private 封裝狀態,暴露語意化介面
  2. 善用介面定義契約,面向介面編程
  3. 理解靜態與實例、早期與延遲綁定的區別
  4. 謹慎使用魔術方法,避免隱式行為增加維護成本
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved