在 Yii 中,移除已綁定到 Component 的 Behavior 有兩種方式:
detachBehavior() 並傳入行為名稱:$component->detachBehavior('myBehavior1');detachBehaviors()(無需參數):$component->detachBehaviors();上述兩個方法最終都會觸發 yii\base\Behavior::detach(),其原始碼如下:
public function detach() {
// 僅當行為已依附到擁有者時才執行解除
if ($this->owner) {
// 遍歷行為定義的事件,逐一解除綁定
foreach ($this->events() as $event => $handler) {
$this->owner->off($event, is_string($handler) ? [$this, $handler] : $handler);
}
// 斷開與擁有者的關聯
$this->owner = null;
}
}
解除綁定的過程只做兩件事,與 attach() 形成完美對稱:
$owner 設為 null,表示該 Behavior 不再依附任何 Component。events() 返回的事件清單,呼叫 Component 的 off() 移除對應的事件處理器。這體現了「善始善終」的設計哲學:掛載時綁定事件與設定擁有者,移除時完整復原。