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

PHP 類別靜態成員深度解析:靜態屬性、靜態方法與常數的正確使用姿勢

     編輯:PHP 綜合知識

靜態成員核心概念

靜態成員屬於「類別本身」,而非某個實例。所有實例共享同一份靜態屬性,靜態方法不依賴 $this。

靜態屬性

<?php
class Counter {
    public static $count = 0;
    public function __construct() {
        self::$count++; // 類別內部用 self:: 或 類別名::
    }
    public static function getCount() {
        return self::$count;
    }
}
$c1 = new Counter();
$c2 = new Counter();
echo Counter::$count; // 2
echo Counter::getCount(); // 2
  • 宣告:public static $var
  • 存取:ClassName::$var 或 self::$var(類別內)、static::$var(晚期靜態綁定)
  • 不可用 $this->var 存取
  • 類似函數全域變數,但受類別作用域限制

靜態方法

<?php
class Math {
    public static function add($a, $b) {
        return $a + $b; // 無 $this,不可存取非靜態成員
    }
}
echo Math::add(1, 2); // 3
// 亦可透過實例呼叫(不建議)
$m = new Math();
echo $m->add(3, 4); // 7,但內部無 $this
  • 宣告:public static function name()
  • 用途:工具方法、工廠方法、單例模式、不需實例狀態的邏輯
  • PHP 不會為靜態方法建立 $this

靜態與非靜態呼叫差異

<?php
class Test {
    public function nonStatic() {
        echo 'non-static: ' . ($this ? 'has $this' : 'no $this');
    }
    public static function staticM() {
        echo 'static: ' . ($this ? 'has $this' : 'no $this');
    }
}
$t = new Test();
$t->nonStatic(); // non-static: has $this
$t->staticM();   // static: no $this  (PHP 5.3+ 嚴格模式下會警告)
Test::staticM(); // static: no $this

類別常數

<?php
class Config {
    const VERSION = '1.0';
    const DB_TYPE = 'mysql';
}
echo Config::VERSION; // 1.0
// 常數隱含 static,不可用 public static const

晚期靜態綁定

<?php
class A {
    public static function who() { echo __CLASS__; }
    public static function test() { self::who(); } // 綁定 A
}
class B extends A {
    public static function who() { echo __CLASS__; }
}
B::test(); // 輸出 A (self:: 綁定定義處)

// 使用 static:: 實現晚期綁定
class A2 {
    public static function test() { static::who(); }
}
class B2 extends A2 {
    public static function who() { echo __CLASS__; }
}
B2::test(); // 輸出 B2

最佳實踐建議

  1. 靜態屬性用於「類別層級共享狀態」(如計數器、快取、單例實例)
  2. 靜態方法用于「無狀態工具邏輯」(如驗證、格式化、工廠)
  3. 避免濫用靜態造成全域狀態,難以測試與並發
  4. 繼承體系中需多態行為時,使用 static:: 而非 self::
  5. 常數用於不可變配置值,語義更清晰
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved