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

PHP 入門教學:類別定義、物件建立與存取、建構子/解構子、$this 機制完整指南

     編輯:PHP 綜合知識

PHP 5 起完整支援物件導向程式設計 (OOP),類別是物件的藍圖,封裝屬性 (成員變數) 與方法 (成員函式)。掌握定義語法、實例化、存取控制、建構子/解構子與 $this 機制,是進入現代 PHP 框架 (Laravel, Symfony) 的基石。

類別定義基本語法

<?php
class 類別名 {          // 命名慣例:PascalCase (首字大寫)
    // 成員屬性 (變數)
    存取修飾符 $屬性名 [= 預設值];
    
    // 成員方法 (函式)
    存取修飾符 function 方法名(參數列表) : 回傳型別 {
        // 方法主體
    }
}
?>
  • 檔案命名慣例:類別名.class.php 或 類別名.php (PSR-4 自動載入)。
  • 記憶體配置:物件實例在 Heap (堆區),基本型別變數在 Stack (棧區)。

建立物件與存取屬性

<?php
$物件名 = new 類別名();      // 括號可省略:new 類別名;
$物件名->屬性名 = 值;        // 寫入 (需 public)
$值 = $物件名->屬性名;       // 讀取 (需 public/protected 視情況)
?>

完整範例:貓咪類別

<?php
class Cat {
    public $name;
    public $age;
    public $color;
}
$cat1 = new Cat();
$cat1->name = '小白';
$cat1->age = 3;
$cat1->color = 'yellow';

$cat2 = new Cat();
$cat2->name = '小花';
$cat2->age = 10;
$cat2->color = 'white';

if ($cat1->name === '小白') {
    echo $cat1->name . '<br />' . $cat1->age . '<br />' . $cat1->color;
}
?>

物件傳遞機制:參考傳遞 (Handle/Reference)

<?php
class Person {
    public $name;
    public $age;
}
$p1 = new Person();
$p1->name = 'www.bianceng.cn';
$p1->age = '10';

function test1($p) {      // 參數預設傳值,但物件變數本身是「參考控制代碼」
    $p->name = '小李';    // 修改「同一個物件」的屬性
}
test1($p1);
echo $p1->name;  // 輸出:小李 (原物件被修改)
?>
  • 物件變數存放的是物件識別碼 (handle),傳遞給函式時複製的是 handle,指向同一 Heap 物件。
  • 若在函式內 $p = new Person() 重新指派,則區域變數指向新物件,外部原物件不受影響。

基本型別 vs 陣列 vs 物件 傳遞行為對照

型別預設傳遞函式內修改影響外部?強制傳參考語法
基本型別 (int, float, bool, string)傳值 (複製)否function foo(&$x)
陣列傳值 (複製整個陣列)否 (複製品)function foo(&$arr)
物件傳參考控制代碼是 (同一物件)無需 (已是參考語意)

基本型別傳值範例

<?php
$a = 90; $b = 90.8; $c = true; $d = 'www.bianceng.cn';
function test1($a, $b, $c, $d) {
    $a = 78; $b = 55.3; $c = false; $d = 'good';
}
test1($a, $b, $c, $d);
echo "$a||$b||$c||$d";  // 輸出:90||90.8||1||www.bianceng.cn (外部未變)
?>

陣列傳值 vs 傳參考

<?php
$arr = [1,2,3];
function byVal($a) { $a[] = 4; }
function byRef(&$a) { $a[] = 4; }
byVal($arr);  print_r($arr);  // [1,2,3] 未變
byRef($arr);  print_r($arr);  // [1,2,3,4] 被修改
?>

建構子 __construct()

  • 物件實例化時自動呼叫,完成初始化。
  • PHP 5 支援兩種:__construct() (雙底線) 與 同類別名() (PHP 4 風格);同時存在時優先呼叫 __construct()。
  • 無回傳值;可帶參數實現參數化初始化。
  • 一個類別只能有一個建構子 (不支援多載),可用預設參數/可變參數模擬多載。
  • 預設存取修飾符為 public。

範例:參數化建構子

<?php
class Person {
    public $name;
    public $age;
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
}
$p1 = new Person('www.bianceng.cn', 16);
$p2 = new Person('李四', 14);
?>

理解 $this

  1. 本質:當前物件的 handle (參考控制代碼)。
  2. 動態繫結:哪個物件呼叫方法,$this 就指向哪個物件。
  3. 僅能在類別內部使用,外部直接用變數名 ($p1->name)。

範例:建構子內初始化

<?php
class Person {
    public $name;
    public $age;
    public function __construct() {
        $this->name = 'www.bianceng.cn';
        $this->age = 10;
    }
}
$p1 = new Person();
echo "$p1->name is $p1->age years old!";  // www.bianceng.cn is 10 years old!
?>

解構子 __destruct()

  • 物件被銷毀時自動呼叫 (程式結束、變數超出作用域、unset()、GC 回收)。
  • 用途:釋放資源 (關閉資料庫連線、釋放圖片資源、關閉檔案控制代碼)。
  • 呼叫順序:後建立的先銷毀 (LIFO),符合堆疊語意。
  • 無參數、無回傳值。

範例:解構子釋放資源

<?php
class Person {
    public $name;
    public $age;
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
    function __destruct() {
        echo $this->name . ' 銷毀資源,關閉資料庫<br />';
    }
}
$p1 = new Person('www.bianceng.cn', 16);
$p2 = new Person('李四', 14);
// 程式結束時輸出順序:
// 李四 銷毀資源,關閉資料庫
// www.bianceng.cn 銷毀資源,關閉資料庫
?>

垃圾回收機制 (GC) 要點

  • PHP 5.3+ 採用同步參考計數 + 週期性 GC。
  • 物件無任何變數參考 (refcount 歸零) 時立即銷毀,呼叫 __destruct()。
  • 循環參考 (A->B, B->A) 導致 refcount 不歸零,需等待 GC 掃描回收 (可調 gc_collect_cycles() 強制)。
  • unset($obj) 移除變數參考,若為最後一個參考則觸發銷毀。

精通類別定義、物件生命週期、傳遞語意與 $this 機制,能寫出記憶體安全、效能優異、易於擴充的 PHP OOP 程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved