PHP类公共数组属性类内有值外部调用为空问题排查
问题修复方案
类属性方法内有值、外部访问为空的问题,按以下优先级排查修复即可:
1. 修正实例化变量名拼写不一致问题
这是最高发的诱因,对照你贴的外部代码:
- 实例化类时赋值的变量是
$saleinvoice(sale为单数,无末尾s):$saleinvoice = new SalesInvoice(); - 后续调用方法、访问属性时用的变量是
$salesinvoice(sale为复数,多了末尾s)
两个变量完全独立,你实际把对象存在了$saleinvoice中,后续操作的是PHP自动生成的空stdClass对象,自然读不到存入的数组数据。
修复方式:统一所有代码段的对象变量名,保证实例化、方法调用、属性访问用的是同一个变量,不要出现单复数拼写差异。
2. 补全方法形参,闭环SQL查询逻辑
你定义的fnSalesInvoice()方法没有声明入参,但外部调用时传入了$_GET["tx"]参数。如果你的SQL查询资源$stmt是依赖这个传入的交易号生成的,方法内部实际拿不到该参数,你之前内部打印能看到值大概率是依赖了全局作用域残留的测试$stmt资源,和当前调用的查询逻辑无关。
修复后的类方法参考:
class SalesInvoice { public $invLineItems=array(); public function fnSalesInvoice($tx){ // 初始化数据库连接、生成查询stmt的逻辑要放在方法内,依赖传入的$tx做查询条件 $conn = sqlsrv_connect(/* 你的数据库连接配置 */); $sql = "SELECT idInvoiceLines, iModule /* 其他需要查询的字段 */ FROM 你的发票行表 WHERE 交易号字段 = ?"; $params = array($tx); $stmt = sqlsrv_query($conn, $sql, $params); // 先清空旧数据,避免多次调用方法时数据重复叠加 $this->invLineItems = array(); while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $this->invLineItems[]= array( "lineId"=>$row["idInvoiceLines"], "module"=> $row["iModule"] // 其余字段按实际需求补全 ); } // 注意你之前的print_r语句少了右括号,属于语法错误,调试时要补全 // print_r($this->invLineItems); } }
3. 校验属性名拼写一致性
PHP类属性大小写敏感,检查三个位置的属性名拼写完全匹配:
- 类内声明属性:
public $invLineItems=array(); - 方法内赋值:
$this->invLineItems[] = ... - 外部访问:
$obj->invLineItems
任何大小写差异都会导致访问到全新的空属性,读不到之前存入的数据。
修复后的外部调用参考
// 开头加这两行开全量错误提示,所有拼写、语法错误会直接报出来,不用盲查 error_reporting(E_ALL); ini_set('display_errors', 1); require_once('salesinvoice.php'); // 统一变量名,这里统一用带s的$salesinvoice $salesinvoice = new SalesInvoice(); // 调用方法传参,变量名保持一致 $salesinvoice->fnSalesInvoice($_GET["tx"]); // 打印验证数组内容 echo "<pre>"; print_r($salesinvoice->invLineItems); echo "</pre>"; // 遍历输出 foreach($salesinvoice->invLineItems as $val){ echo "<br>". $val["lineId"] . $val["module"] ; }
内容的提问来源于stack exchange,提问作者Nathan DevX
相关产品推荐
相关产品推荐

