注意:未定义 属性: stdClass:: with null json 值
Notice: Undefined property: stdClass:: with null json value
我的 test.json 个文件:
{
"data1": "test1",
"data2": "test2",
"data3": "test3",
"data4": "test4",
"data5": "test5",
"data6": {
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5",
"key6": "value6",
"key7": "value7"
},
"data7": "test7"
}
我的 index.php :
<?php
/* DEBUG FUNCTION */
ini_set("display_errors", "1");
error_reporting(E_ALL);
require 'test_controller.php';
$controller = new Controller();
$controller->dispatch();
我的 test_controller.php :
<?php
require 'test_view.php';
require 'test_model.php';
class Controller
{
protected $view;
protected $model;
public function __construct()
{
$this->view = new TestView();
$this->model = new TestModel();
}
public function dispatch()
{
$json = $this->model->getAPI();
$this->view->displayHome($json);
}
}
我的 test_model.php :
<?php
class TestModel
{
public function __construct()
{
}
public function getAPI()
{
$data = file_get_contents('test.json');
$json = json_decode($data);
return $json;
}
}
我的 test_view.php :
<?php
class TestView
{
public function __construct()
{
}
public function parseJson($datas){
$value = '∅';
$data = (isset($datas)) ? $datas : $value ;
return $data;
}
public function displayHome($datas) {
$page = $this->parseJson($datas->data1);
$page .= '<br>';
$page .= $this->parseJson($datas->nodata);
$page .= '<br>';
$page .= $this->parseJson($datas->data6->key1);
$page .= '<br>';
$page .= $this->parseJson($datas->data6->nokey);
$page .= '<br>';
echo $page;
}
}
结果是:
Notice: Undefined property: stdClass::$nodata in
/home/meteobel/networkbell.com/mbell/test/test_view.php on line 21
Notice: Undefined property: stdClass::$nokey in
/home/meteobel/networkbell.com/mbell/test/test_view.php on line 25
test1
∅
value1
∅
所以我的问题是为什么我有这个错误结果:“注意:未定义属性:stdClass::”
当然,我在此示例中尽可能地简化了我的问题(保留 MVC 架构),但在我的初始脚本中,我的 json 中有许多空值,我仍然想为其显示一些内容(此处 ∅ = '∅'
)而不会产生错误。我认为它也减慢了我的页面处理速度,就好像 PHP 在真空中思考
谢谢
编辑:
我用 :
解决了这个问题
$page .= isset($datas->nodata) ? $datas->nodata : '∅';
对于泛型函数,没有在isset中声明所有$data,我们最终可以使用
$page .= $this->parseJson('$datas->nodata');
使用 eval() 函数
问题是传递给函数的表达式在函数被调用之前被求值,函数只看到值,所以当你检查 isset() 时,警告已经发出。
最简单的解决方案是根本不使用函数,并使用 "null coalescing operator" 来保持代码简短:
$page .= $datas->nodata ?? '∅'
您也可以将替换放在常量或函数调用中,以避免每次都粘贴它:
const NA='∅';
$page .= $datas->nodata ?? NA;
我的 test.json 个文件:
{
"data1": "test1",
"data2": "test2",
"data3": "test3",
"data4": "test4",
"data5": "test5",
"data6": {
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5",
"key6": "value6",
"key7": "value7"
},
"data7": "test7"
}
我的 index.php :
<?php
/* DEBUG FUNCTION */
ini_set("display_errors", "1");
error_reporting(E_ALL);
require 'test_controller.php';
$controller = new Controller();
$controller->dispatch();
我的 test_controller.php :
<?php
require 'test_view.php';
require 'test_model.php';
class Controller
{
protected $view;
protected $model;
public function __construct()
{
$this->view = new TestView();
$this->model = new TestModel();
}
public function dispatch()
{
$json = $this->model->getAPI();
$this->view->displayHome($json);
}
}
我的 test_model.php :
<?php
class TestModel
{
public function __construct()
{
}
public function getAPI()
{
$data = file_get_contents('test.json');
$json = json_decode($data);
return $json;
}
}
我的 test_view.php :
<?php
class TestView
{
public function __construct()
{
}
public function parseJson($datas){
$value = '∅';
$data = (isset($datas)) ? $datas : $value ;
return $data;
}
public function displayHome($datas) {
$page = $this->parseJson($datas->data1);
$page .= '<br>';
$page .= $this->parseJson($datas->nodata);
$page .= '<br>';
$page .= $this->parseJson($datas->data6->key1);
$page .= '<br>';
$page .= $this->parseJson($datas->data6->nokey);
$page .= '<br>';
echo $page;
}
}
结果是:
Notice: Undefined property: stdClass::$nodata in /home/meteobel/networkbell.com/mbell/test/test_view.php on line 21
Notice: Undefined property: stdClass::$nokey in /home/meteobel/networkbell.com/mbell/test/test_view.php on line 25
test1 ∅ value1 ∅
所以我的问题是为什么我有这个错误结果:“注意:未定义属性:stdClass::”
当然,我在此示例中尽可能地简化了我的问题(保留 MVC 架构),但在我的初始脚本中,我的 json 中有许多空值,我仍然想为其显示一些内容(此处 ∅ = '∅'
)而不会产生错误。我认为它也减慢了我的页面处理速度,就好像 PHP 在真空中思考
谢谢
编辑:
我用 :
解决了这个问题$page .= isset($datas->nodata) ? $datas->nodata : '∅';
对于泛型函数,没有在isset中声明所有$data,我们最终可以使用
$page .= $this->parseJson('$datas->nodata');
使用 eval() 函数
问题是传递给函数的表达式在函数被调用之前被求值,函数只看到值,所以当你检查 isset() 时,警告已经发出。
最简单的解决方案是根本不使用函数,并使用 "null coalescing operator" 来保持代码简短:
$page .= $datas->nodata ?? '∅'
您也可以将替换放在常量或函数调用中,以避免每次都粘贴它:
const NA='∅';
$page .= $datas->nodata ?? NA;