【问题标题】:Notice: Undefined property: stdClass:: with null json value注意:未定义的属性:stdClass:: 带有 null json 值
【发布时间】:2021-07-11 12:36:48
【问题描述】:

我的 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 = '&#8709;';
        $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;
    }
}

结果是:

注意:未定义的属性:stdClass::$nodata in /home/meteobel/networkbell.com/mbell/test/test_view.php 在第 21 行

注意:未定义的属性:stdClass::$nokey in /home/meteobel/networkbell.com/mbell/test/test_view.php 在第 25 行

测试1 ∅ 价值1 ∅

所以我的问题是为什么我有这个错误结果:“注意:未定义的属性:stdClass::”

当然,我在这个例子中尽可能地简化了我的问题(保持 MVC 架构),但是在我的初始脚本中,我的 json 中有许多空值,我仍然想显示一些东西(这里 ∅ = @987654327 @) 不会产生错误。我认为它也会减慢我的页面处理速度,就好像 PHP 是在真空中思考一样

谢谢


编辑:

我解决了这个问题:

$page .= isset($datas->nodata) ? $datas->nodata : '&#8709;';

对于一个泛型函数并且没有在isset中声明所有的$data,我们最终可以使用

$page .= $this->parseJson('$datas->nodata');

带有 eval() 函数

https://www.php.net/manual/en/function.eval.php

【问题讨论】:

  • nodatanokey 在您的 JSON 中不存在,因此该错误是不言自明的。
  • 这个逻辑在你的函数$data = (isset($datas)) ? $datas : $value ;中也可能是错误的。调用函数前需要检查属性是否存在
  • 谢谢克里斯哈斯。 isset 不足以测试我的 json 文件中是否存在数据?
  • El_Vanja 我知道,正是我的 parseJson 函数的作用是测试我的 json 中是否存在值
  • isset 完全足够了,正如克里斯已经建议的那样,您只是按照错误的顺序进行操作。您在将属性传递给进行检查的函数时尝试访问该属性。您需要在尝试访问它之前进行检查。

标签: php json stdclass


【解决方案1】:

问题是你传递给你的函数的表达式在函数被调用之前被评估,而函数只看到,所以当你检查的时候使用 isset() 警告已经被提出。

最简单的解决方案是根本不使用函数,并使用"null coalescing operator" 保持代码简短:

$page .= $datas->nodata ?? '&#8709;'

您还可以将替换放在常量或函数调用中以避免每次都粘贴它:

const NA='&#8709;';
$page .= $datas->nodata ?? NA;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-17
    • 2016-11-12
    • 2011-03-05
    • 2015-02-27
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多