PHP跨文件调用类方法时类属性取值为空问题排查
PHP类属性取值为空问题修复
问题场景
开发PHP后端应用时无显式报错,但调用类方法返回的JSON解码后,validated、status字段值均为空,涉及3个业务文件。
原问题代码
Index.php
<?php include "methods.php"; $user=new user(); if (isset($_GET["action"])) { switch ($_GET["action"]) { case 'login': $user->login(); break; default: echo("error 404"); break; } } else { echo("error 404"); } ?>
Methods.php
<?php include "extra.php"; class user { public function login() { $input = new input(); $error = "fucked"; $validationresult = json_decode($input->validateinput(), true); var_dump($validationresult); $validated = $validationresult["validated"]; if ($validated) { echo "yes"; } else { var_dump($validationresult); } } } ?>
extra.php
<?php class input { public $password; public $status; public $validated; public function __construct() { } public function validateinput () { $password = $_GET["password"]; $this-> $status = "red"; $this->$validated = false; echo($this-> $status); return json_encode('{ "validated":'.$this->get_validate().', "error":{ "status":"'.$this->$status.'", "username":"ok", "password":"cannot be more than 5" } }'); } public function get_validate(){ return $this->$validated; } } ?>
问题根因
- 类属性访问语法错误:PHP中通过
$this访问实例属性时,属性名前不需要加$符号。原代码中$this-> $status、$this->$validated属于可变属性访问写法,并没有对类中预先定义的$status、$validated属性赋值,后续读取时自然拿到空值。 - JSON生成逻辑错误:原代码手动拼接JSON字符串,直接将布尔类型的
false拼接入字符串时,PHP会自动将布尔false转换为空字符串,最终生成的JSON格式非法,json_decode解析失败。 - 多余输出干扰:
validateinput方法中提前执行了echo($this-> $status),输出内容会拼接在返回的JSON字符串前,进一步导致JSON解析失败。
修复后代码
核心修改extra.php,修正属性访问语法,改用数组构建JSON数据,删除多余输出:
<?php class input { public $password; public $status; public $validated; public function __construct() { } public function validateinput () { $password = $_GET["password"]; // 修正属性访问语法,去掉属性名前的$ $this->status = "red"; $this->validated = false; // 直接用数组构建JSON结构,避免手动拼接的格式、类型问题 return json_encode([ "validated" => $this->get_validate(), "error" => [ "status" => $this->status, "username" => "ok", "password" => "cannot be more than 5" ] ]); } public function get_validate(){ // 修正属性访问语法 return $this->validated; } } ?>
其余两个文件无需大改,注意不要在返回JSON的逻辑中提前输出任意内容即可。
内容的提问来源于stack exchange,提问作者daviddanielng
相关产品推荐
相关产品推荐

