背景情况
今天把本地环境的PHP版本升级到了PHP7,之前一直用的是5.5,升级之后发现报了一个警告错误:Warning: Declaration of (类方法1) should be compatible with (类方法2);
字面上理解是:类方法1的声明应该符合类方法2,搜索引擎貌似给了个专业的说法:“方法重写,参数不同”。
事件还原
之前做WordPress主题时为了显示导航菜单的图像描述,从wordpress大学趴了一段代码,大概就是自定义wp_nav_menu()函数的Walker类来输出描述。
我的原代码有这样一段:
class description_walker extends Walker_Nav_Menu{
function start_el( &$output, $item, $depth, $args ){
// ..........
}
}
然后报错:
Warning: Declaration of description_walker::start_el( &$output, $item, $depth, $args ) should be compatible with Walker_Nav_Menu::start_el( &$output, $item, $depth = 0, $args = Array, $id = 0) in ……
解决
结合搜索到的信息给出我的理解:
其实警告中已经给出了解决办法,由于代码中使用了 class … extends … 类继承,报错警告就是告诉你:重写方法的参数不对,你既然继承了这个基类方法,那么重写方法的参数也要按着原样来。
基类中,start_el 这个类方法有 $depth = 0, $args = Array, $id = 0 三个参数定义了默认值,我的代码中只有 $depth 和 $args 两个参数,并且没有默认值,同时还少了一个参数 $id = 0。
于是在新版的PHP中就报错,把我重写的方法参数照着基类改一下就解决问题了:
class description_walker extends Walker_Nav_Menu{
function start_el( &$output, $item, $depth = 0, $args = Array, $id = 0 ){
// ..........
}
}
Tips: 函数签名:包括 函数/方法名,参数类型,参数个数