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

PHP 物件操作符完解:::、->、self、$this 使用時機與差異

     編輯:PHP 相關知識

核心規則速查表

存取目標類別外部類別內部
靜態屬性/方法、常數ClassName::$staticProp
ClassName::CONST_NAME
self::$staticProp
self::CONST_NAME
實例屬性/方法$obj->prop
$obj->method()
$this->prop
$this->method()

詳細說明與範例

1. -> 操作子:存取實例成員

用於非靜態屬性與方法。$this 代表當前實例物件。

<?php
class TestThis {
    private $content;

    public function __construct($content) {
        $this->content = $content; // 設定實例屬性
    }

    public function printContent() {
        echo $this->content . '<br>'; // 讀取實例屬性
    }
}

$obj = new TestThis('歡迎來到 PHP 世界!');
$obj->printContent(); // 輸出: 歡迎來到 PHP 世界!

2. :: 操作子:存取靜態成員與常數

用於 static 屬性/方法、const 常數。亦用於呼叫父類別方法(parent::)。

常數定義與存取

class ClassA {
    const PI = 3.14; // 常數不加 $ 符號
    private static $name = 'Static Class A';
    public $value = 'instance';

    public static function getName() {
        return self::$name; // 正確:存取靜態屬性
    }

    // 錯誤:靜態方法不可存取非靜態屬性
    // public static function getValue() { return self::$value; }

    public function getPI() {
        return self::PI; // 實例方法存取常數
    }
}

echo ClassA::PI;        // 3.14
echo ClassA::getName(); // Static Class A

父類別建構子呼叫

class ParentClass {
    public $name;
    public function __construct($name) {
        $this->name = $name;
    }
}

class ChildClass extends ParentClass {
    public $gender, $age;

    public function __construct($gender, $age) {
        parent::__construct('NoStop'); // 呼叫父類別建構子
        $this->gender = $gender;
        $this->age = $age;
    }

    public function printInfo() {
        echo "{$this->name}是個{$this->gender},今年{$this->age}歲<br>";
    }
}

$obj = new ChildClass('女性', 22);
$obj->printInfo(); // NoStop是個女性,今年22歲

3. self vs $this 關鍵差異

  • self:代表當前類別(靜態綁定),用於存取靜態成員、常數
  • $this:代表當前實例物件,用於存取實例屬性、方法
  • static(PHP 5.3+):晚期靜態綁定,代表實際被呼叫的類別

4. 靜態方法限制

靜態方法不可直接存取非靜態屬性($this 在靜態語境中不可用):

class Demo {
    public static $staticProp = 'static';
    public $instanceProp = 'instance';

    public static function staticMethod() {
        echo self::$staticProp; // 正確
        // echo $this->instanceProp; // 錯誤:Using $this when not in object context
    }

    public function instanceMethod() {
        echo self::$staticProp;   // 正確
        echo $this->instanceProp; // 正確
    }
}

實務最佳實踐

  1. 常數命名:全大寫 + 底線分隔(如 MAX_SIZE)
  2. 靜態屬性:用於共享資料(計數器、快取、單例模式)
  3. 避免濫用靜態:增加耦合度,難以測試與模擬
  4. 父類別呼叫:永遠使用 parent::method() 而非 ParentClass::method(),支援繼承鏈重構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved