WordPress插件静态方法用$this在PHP7.1正常7.4.20报错原因咨询
版本差异原因
$this是类实例指针,仅在类的非静态方法上下文中有效,静态方法不依赖类实例初始化就可调用,本身语法层面就不支持访问$this- PHP 7.1及更早版本仅会对静态方法内使用
$this的行为抛出E_STRICT级别警告,不会阻断代码执行,大部分生产环境默认屏蔽E_STRICT级别的错误提示,因此你会误认为该代码可以正常运行 - 从PHP 7.2版本开始,该违规行为被正式升级为编译阶段致命错误,只要检测到静态方法内存在
$this调用就会直接抛出PHP Fatal error: Using $this when not in object context错误终止运行,没有兼容空间。
适配修复方案
针对你的WordPress插件场景,有两种快速修复方式:
方案1:移除不必要的static修饰符(更推荐)
该方法需要调用实例的回调方法,本身不需要定义为静态,直接去掉static修饰符即可兼容所有版本:
public function add_test_shortcode_metabox( $post ) { add_meta_box( 'test-shortcode-metabox', esc_html__( 'Shortcode', 'theme-extensions' ), array( $this, 'display_test_shortcode_metabox' ) , 'theme_test', 'side', 'low' ); }
方案2:保留静态定义,调整为静态回调
如果业务逻辑必须保留该方法的静态属性,将回调改为类名静态调用即可,同步修改对应的回调方法为静态:
public static function add_test_shortcode_metabox( $post ) { add_meta_box( 'test-shortcode-metabox', esc_html__( 'Shortcode', 'theme-extensions' ), array( __CLASS__, 'display_test_shortcode_metabox' ) , 'theme_test', 'side', 'low' ); } // 同步修改对应回调方法为静态 public static function display_test_shortcode_metabox() { // 原有回调逻辑保持不变 }
内容的提问来源于stack exchange,提问作者Mohammad Umar
相关产品推荐
相关产品推荐

