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

PHP 類與對象完整指南:從屬性、常量、自動加載到對象引用機制

     編輯:PHP 相關知識

PHP 類與對象完整指南:從屬性、常量、自動加載到對象引用機制

PHP 5 完全重寫對象模型,引入訪問控制、抽象類、接口、魔術方法、類型約束等特性,奠定了現代 PHP 面向對象編程基礎。本文系統梳理類定義、屬性/常量聲明、自動加載、對象引用語義等核心知識點,附帶可運行代碼示例。

類的基本定義與實例化

<?php
class User {
    // 屬性聲明
    public $name = 'Tom';
    protected $email;
    private $password;

    // 常量
    const STATUS_ACTIVE = 1;
    const STATUS_INACTIVE = 0;

    // 構造函數
    public function __construct($name, $email) {
        $this->name = $name;
        $this->email = $email;
    }

    // 方法
    public function getName() {
        return $this->name;
    }
}

// 實例化
$user = new User('Jerry', 'jerry@example.com');
echo $user->getName(); // Jerry
echo User::STATUS_ACTIVE; // 1

屬性深度解析

初始化規則:屬性默認值必須是編譯時常量(標量、常量表達式、數組),不能是運算結果或函數調用:

private $name = 'Tom';           // OK
private $name = 'Tom' . 'Jack';  // Error: 常量表達式在 PHP 5.6+ 允許,5.3 不允許
private $name = strlen('Tom');   // Error: 函數調用
private $items = [1,2,3];        // OK (PHP 5.4+)

類常量

  • 聲明:const NAME = 'value';(不能用 define())
  • 值必須為常量表達式,不可為變量、屬性、運算結果、函數調用
  • 訪問:類內 self::NAME,類外 ClassName::NAME,對象 $obj::NAME (PHP 5.3+)
  • 繼承:子類可覆蓋,parent::NAME 訪問父類常量

自動加載機制

避免手動 require,按命名規範自動載入類文件。

1. __autoload()(PHP 5.1.2+,已棄用)

function __autoload($className) {
    require_once $className . '.php';
}
$obj = new Name(); // 自動載入 Name.php

2. spl_autoload_register()(推薦,支援多加載器、命名空間)

spl_autoload_register(function ($class) {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) require_once $file;
});

// PSR-4 標準:Composer 自動生成 vendor/autoload.php
require_once 'vendor/autoload.php';
use App\Model\User;
$user = new User();

對象引用機制:核心概念

PHP 對象在賦值、傳參、返回時,傳遞的是對象標識符(handle),而非對象副本。
這意味著:$b = $a 後,$a 和 $b 指向同一個對象實例,修改屬性相互影響。
若需複製,必須使用 clone 關鍵字(淺拷貝,深拷貝需實現 __clone())。

$a = new User('A');
$b = $a;        // 引用賦值
$b->name = 'B';
echo $a->name;  // 'B' —— 同一對象

$c = clone $a;  // 淺拷貝
$c->name = 'C';
echo $a->name;  // 'B' —— 不影響原對象

魔術方法速查

關鍵字訪問範圍說明
public任意位置完全公開
protected類內部、子類、父類繼承體系可見
private僅定義該屬性的類封裝核心,子類不可見
方法觸發時機典型用途
__construct實例化初始化
__destruct對象銷毀資源釋放
__call調用不可訪問方法代理、動態方法
__callStatic靜態不可訪問方法靜態代理
__get/set/isset/unset不可訪問屬性讀寫屬性代理、虛擬屬性
__sleep/wakeupserialize/unserialize序列化控制
__toString對象作字符串使用調試輸出
__invoke對象作函數調用可調用對象
__cloneclone 操作深拷貝邏輯
__debugInfovar_dump 輸出自定義調試信息

進階特性一覽

  • 抽象類/方法:abstract,強制子類實現
  • Final 類/方法:final,禁止繼承/覆蓋
  • 接口:interface,定義契約,支援多實現
  • Trait:trait,代碼復用單元,解決單繼承限制
  • 類型約束:參數/返回類型聲明(PHP 7+:標量類型、返回類型、嚴格模式)
  • 匿名類:new class() {},一次性對象

完整示例:自動加載 + 類定義

目錄結構:

project/
├── index.php
├── Name.php
└── User.php
// index.php
<?php
header("Content-Type: text/html; charset=utf-8");
function __autoload($className) {
    require_once $className . '.php';
}
$obj = new Name();
$obj2 = new User();
var_dump($obj->getName());
var_dump($obj2->getUser());
?>

// Name.php
<?php
class Name {
    public function getName() { return "歐陽俊"; }
}

// User.php
<?php
class User {
    public function getUser() { return ['ouyangjun', 'jpp']; }
}

掌握 PHP 面向對象核心機制,是編寫可維護、可擴展、現代化 PHP 代碼的基石。建議配合 PSR-1/4/12 規範、Composer 自動加載、PHPStan 靜態分析工具,構建專業級代碼庫。

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