Skip to content

Typed property Widget\Menu::$title accessed before initialization #1982

@little-gt

Description

@little-gt

Issue: Typed property Widget\Menu::$title accessed before initialization

错误信息

Typed property Widget\Menu::$title must not be accessed before initialization

环境

  • PHP 8.0+ (启用了类型化属性)
  • Typecho 1.3.0 / dev 版

复现条件
当请求的 URL 未匹配到任何后台菜单项时(例如直接访问不存在的后台路径,或某些插件引起的路由异常),Widget\Menu::execute() 中不会给 $title 属性赋值。随后在 admin/header.php:54 中读取 $menu->title 即会触发此错误。

根本原因
Widget\Menu 类中声明了类型化属性(如 public string $title),PHP 要求这些属性在首次访问前必须已被初始化。但在特定代码路径下,$title$addLink$currentUrl$currentMenuUrl 均未被赋值,导致抛出 Error

修复方案
为所有未初始化的类型化属性提供默认值,确保任何执行路径下属性都有有效状态。

修改文件:var/Widget/Menu.php

class Menu extends Base
{
-    public string $title;
+    public string $title = '';

-    public ?string $addLink;
+    public ?string $addLink = null;

-    private string $currentUrl;
+    private string $currentUrl = '';

-    private string $currentMenuUrl;
+    private string $currentMenuUrl = '';
}

效果

  • 未匹配菜单时,$title 为空字符串,不会抛出错误。
  • $addLink 允许为 null,与原有逻辑兼容。
  • $currentUrl / $currentMenuUrl 初始化后可供后续方法安全使用。

备注
该修复兼容 PHP 7.4+,不会影响现有功能。建议同步检查 Widget\Menu 中其他可能未初始化的类型化属性。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions