PHP 類成員的可見性控制嚴格遵循「封裝」原則:
<?php
class Foo {
private $name = 'hdj';
public function getName() { return $this->name; }
}
class Bar extends Foo {
public $name = 'deeka'; // 這是 Bar 自己的 public 屬性,非覆寫
}
$bar = new Bar;
var_dump($bar->name); // string(5) "deeka" -> 存取 Bar::\$name (public)
var_dump($bar->getName()); // string(3) "hdj" -> Foo::getName() 內部存取 Foo::\$name (private)
?>
輸出結果證明:Foo::$name (private) 與 Bar::$name (public) 是兩個獨立儲存空間。getName() 定義在 Foo 中,其 $this->name 永遠綁定 Foo::$name,不受子類同名屬性影響。
PHP 運算子優先級 (高到低) 關鍵片段:
&& (邏輯與) > || (邏輯或) > = (賦值) > and / or / xor
核心規則:$a = 5 || $b = 7 等價於 $a = (5 || $b = 7)。賦值運算子優先級 低於 邏輯運算子。
<?php
$a = 3; $b = 6;
if ($a = 5 || $b = 7) { // 解析:$a = (5 || ($b = 7))
// 5 為 truthy,短路求值,\$b=7 不執行
echo $b . '<br/>'; // 輸出 6 (原值)
$a++; $b++;
}
var_dump($a, $b); // int(2) int(7)
// 解析:\$a = (true) -> \$a=1 (bool true 轉 int) -> \$a++ -> 2
// \$b 未在 if 內賦值,僅 \$b++ -> 7
?>
<?php
$a = 3; $b = 6; $c = 1;
if ($a = 5 || $b = 7 && $c = 10) { // 解析:$a = (5 || (($b = 7) && ($c = 10)))
// 5 為 truthy,短路,&& 右側不執行
$a++; $b++;
}
var_dump($a, $b, $c); // int(2) int(7) int(1)
// \$a = true -> 1 -> ++ -> 2
// \$b, \$c 均未賦值,僅 \$b++ -> 7
?>
<?php
$a = 3; $b = 6; $c = 1;
if ($a = 0 || $b = 7 && $c = 10) { // 解析:$a = (0 || (($b = 7) && ($c = 10)))
// 0 為 falsy,執行右側:\$b=7 (truthy) -> 執行 \$c=10 (truthy) -> 整體 true
$a++; $b++;
}
var_dump($a, $b, $c); // int(2) int(8) int(10)
// \$a = true -> 1 -> ++ -> 2
// \$b = 7 -> ++ -> 8
// \$c = 10
?>
==/===。if (($a = 5) || ...) 雖合法但極易誤讀。if (($a = foo()) || ($b = bar())) 明確表達意圖。and/or 低優先級特性 (慎用):$a = 5 or $b = 7 等價 ($a = 5) or ($b = 7)。但此寫法違反主流編碼規範 (PSR-12 等),不推薦。private 實現「類級封裝」,子類擁有同名屬性屬「遮蔽」而非「覆寫」。&& > || > =。條件表達式中混用賦值與邏輯運算極高風險,堅決杜絕,改用明確比較與括號。