已升级的服务器现在类My_Walker_Nav_Menu扩展Walker_Nav_Menu不工作

时间:2021-02-04 作者:Tom

我的服务器刚刚在Dreampress升级,它似乎向日志中抛出了错误。: Got error \'PHP message: PHP Warning: Declaration of My_Walker_Nav_Menu::start_lvl(&$output, $depth) should be compatible with Walker_Nav_Menu::start_lvl(&$output, $depth = 0, $args = NULL) in /home/wp_bizvdr/ctisinc.com/wp-content/themes/ctis/functions.php on line 5\',

由于每次加载页面时都会发生这种情况,它会累积到日志中,并可能会在一段时间内破坏我们的网站。至少这是Dreamhost告诉我们的。

我想这就是它所指的代码。我似乎写得对,但我想让你接受。

class My_Walker_Nav_Menu extends Walker_Nav_Menu { function start_lvl(&$output, $depth, $args = array() ) { $indent = str_repeat("\\t", $depth); $output .= "\\n$indent<ul class=\\"dropdown-menu\\">\\n"; } } 有什么想法吗?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

简而言之,(正如我在评论中所说)在你的函数声明中,the $depth parameter should be defined as $depth = 0. 那是因为original function (或class方法)通过设置默认值使其成为可选的,因此您也应该执行相同的操作:

function start_lvl( &$output, $depth = 0, $args = array() )
如果您想知道为什么会这样,或者为什么PHP会抛出警告,那么请查看PHP手册中关于;Signature compatibility rules"E;上面写着:

重写方法时,其签名必须与Parent方法兼容。否则,将发出致命错误,或者在PHP8.0.0之前,发出E_WARNING 生成级别错误。如果签名尊重variance规则,使强制参数成为可选的,如果有任何新参数是可选的。这就是众所周知的里斯科夫替代原理,简称orLSP。这个constructor,和private 方法不受这些签名兼容性规则的约束,因此在SignatureMitch情况下不会发出致命错误。

在那一页上,实际上有一些例子表明,删除参数或强制使用可选参数的子方法与父方法不兼容。

所以我希望这能有所帮助。:)

相关推荐

古腾堡块:如何重新加载ServerSideRender?

我终于让ServerSideRender开始工作了。但是,在保存帖子时,如何重新加载ServerSideRender? save: props => { return null; }, 我想这里我需要一个触发器之类的东西来再次从插件加载数据。有人能告诉我去哪里找吗?serversiderender列出了标题结构,并需要在更新帖子时显示新数据。这是整个索引。块的js。const { __, setLocaleData } = wp.i18n;&#