Typecho | 记录一次升级 1.2.0 后的问题排查
问题复现
把 Typecho 升级到 1.2.1 后发现我的主页的最近文章和随机项目部分出现了下面的报错
Warning: Invalid argument supplied for foreach() in Root/Site/index.php on line 167
由于这部分我是采用自写接口文件,采用接口来获取这些数据,导致似乎新版本因为某些东西发生变动,无法正常读取数据。
当我去访问 Api.php 的时候这个文件果不其然的报错了!
Class 'Widget_Abstract_Contents' not found Error: Class 'Widget_Abstract_Contents' not found in Root/Site/var/Typecho/Widget.php:154 Stack trace: #0 Root/Site/Api.php(26): Typecho\Widget::widget() #1 {main}
尝试解决
当我发现这个问题后立马去 Typecho 官方站点查阅了 v1.2.0更新内容。仔细看就可以看到
升级到
PHP 7.2
后将给 Typecho 代码带来如下变化:
- 类名全部由下划线风格转向反斜线的
namespace
风格// 之前的代码 new Typecho_Widget_Helper_Form(); // 之后的代码 use Typecho\Widget\Helper\Form; new Form();
- 编码风格建议统一使用PSR-12
- 更强的类型约束,所有的接口参数和返回值都将加上类型约束,所以大家在使用的时候也要更加注意规范。
- 我们移除了大量过时/无用的代码。
$ 尝试一
是不是代码风格更改造成的代码不可用?所以我将 Api 文件中的 namespace 风格更换成了新版本要求的。当我运行代码后还是不奏效。
正当我苦恼的时候,定睛一看这段文字的后面 得益于新设计的自动加载系统,老的类命名和使用方法也将得到兼容,所以你不必担心之前的插件和主题用不了。
好像不是命名空间的问题 :orz15: 于是这个尝试就作废了!
$ 尝试二
我开始检查代码,一行一行的看,Widget_Abstract_Contents
这个类吸引了我的注意。
这一行代码是一个 Typecho 自带的组件代码,可以调用文章内容(可调教度肥肠高)这个好像使用了抽象的方法,我开始顺藤摸瓜去 Widget 里面找这个方法类,找了半天被找到。然后我就去 Github上面找。发现是有个地方写着一个全局变量 TYPECHO_CLASS_ALIASES
翻译过来就是类的别名的意思,我看到 Widget_Abstract_Contents 赫然指向了 \Widget\Base\Contents 又想到更新日志里面提到到,我果断的的把后者替换了前者,刷新页面!Binggo~ 成功返回了文章与作品的 Json 数据 ~
这里我附录以下最新版的别名,说不定以后会用到!
Key | Value |
---|---|
Typecho_Plugin_Interface | \Typecho\Plugin\PluginInterface |
Typecho_Widget_Helper_Empty | \Typecho\Widget\Helper\EmptyClass |
Typecho_Db_Adapter_Mysql | \Typecho\Db\Adapter\Mysqli |
Widget_Abstract | \Widget\Base |
Widget_Abstract_Contents | \Widget\Base\Contents |
Widget_Abstract_Comments | \Widget\Base\Comments |
Widget_Abstract_Metas | \Widget\Base\Metas |
Widget_Abstract_Options | \Widget\Base\Options |
Widget_Abstract_Users | \Widget\Base\Users |
Widget_Metas_Category_List | \Widget\Metas\Category\Rows |
Widget_Contents_Page_List | \Widget\Contents\Page\Rows |
Widget_Plugins_List | \Widget\Plugins\Rows |
Widget_Themes_List | \Widget\Themes\Rows |
Widget_Interface_Do | \Widget\ActionInterface |
Widget_Do | \Widget\Action |
AutoP | \Utils\AutoP |
PasswordHash | \Utils\PasswordHash |
Markdown | \Utils\Markdown |
HyperDown | \Utils\HyperDown |
Helper | \Utils\Helper |
Upgrade | \Utils\Upgrade |
问题反思
寻根法解决问题,这个问题鸽置了大半年了,今天终于是有时间来解决了QAQ,多看看 Github。