引入含$this的PHP文件报非对象上下文使用$this错误如何解决
错误原因
你的报错本质是file5.php原本是某类内部加载的片段代码,上下文依赖类实例$this,你直接在类外的file1.php中独立引入该文件时,不存在对应的类实例,所以$this调用无效。
解决方案
方案1:修改file5.php适配独立调用(适配你提到的get_instance()框架场景)
把所有$this替换为框架单例实例即可,同时修正全局变量赋值的问题:
<?php // 顶部先获取框架单例实例 $ins = get_instance(); if ( !$ins->is_users_rating_disabled() ): $score = isset( $ins->users_data['overall'] ) ? $ins->users_data['overall'] : 0; $count = isset( $ins->users_data['count'] ) ? $ins->users_data['count'] : 0; $theme = $ins->template_field('template_theme', true); $maximum_score = $ins->template_field('template_maximum_score', true); $revOver = $score; // 注意全局变量名大小写敏感,和变量名保持一致 $GLOBALS['revOver'] = $revOver; // 原代码缺少if闭合标签,补充上 endif; ?>
你之前全局变量不生效有两个常见原因:
- 原代码的
if语句没有闭合,$revOver赋值逻辑可能根本没有执行 - 全局变量名大小写不一致,你之前写的是
GLOBALS['revover']全小写,和$revOver大小写不匹配,PHP大小写敏感无法识别
修改完成后你在file1.php里先引入file5.php,就能直接用$GLOBALS['revOver']拿到值。
方案2:无需修改file5.php,直接封装方法调用(更推荐)
找到is_users_rating_disabled()方法所属的类,新增一个公共方法对外暴露你需要的$revOver值:
public function get_rev_over() { if ( !$this->is_users_rating_disabled() ) { return isset( $this->users_data['overall'] ) ? $this->users_data['overall'] : 0; } return 0; }
之后你在file1.php中不需要引入file5.php,直接调用该方法即可拿到值:
$ins = get_instance(); $revOver = $ins->get_rev_over();
这个方案不会破坏原有file5.php的逻辑,也不需要依赖全局变量,可维护性更高。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

