我的服务器刚刚在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"; } }
有什么想法吗?
最合适的回答,由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情况下不会发出致命错误。
在那一页上,实际上有一些例子表明,删除参数或强制使用可选参数的子方法与父方法不兼容。
所以我希望这能有所帮助。:)