【问题标题】:Using a returned objects array from a PHP function使用 PHP 函数返回的对象数组
【发布时间】:2012-03-27 03:49:57
【问题描述】:

我遇到了一个奇怪的问题。我正在学习 PHP(用于在 Java 中编程),并且正在尝试做一件简单的事情。我有一个 DAO 方法可以做这样的事情:

while (oci_fetch($parse)) {
        $stats = new Stats();
        $stats->setId($id);
        $stats->setName($name);
        $stats->setEmail($email);
        $stats->setGender($gender);
        $stats->setBirthday($birthday);
        $statslist[] = $stats;
    }

    return $statslist;

我还有另一个使用这个函数的 PHP 文件(称为 getById)作为测试,如下所示:

    $statsdao = new StatsDAO();
    $statslist[] = $statsdao->getById(1);
    foreach ($statslist as $stat) {
        echo $stat->getName();
    }

这看起来很简单:DAO 返回一个数组,而我的其他文件读取返回的 Stats 数组并打印它。但是我收到了这个错误消息:

致命错误:在非对象上调用成员函数 getName() /var/www/socializi/interfaceusuario/index.php 第 25 行

奇怪的是:如果我在 DAO 的 getById 函数中调用 foreach 循环,它会打印出来,但是当我从外部调用该函数并将其分配给另一个数组时,它不会将数组的内容识别为对象。

我在这里做错了什么? 谢谢!

【问题讨论】:

    标签: php arrays object


    【解决方案1】:

    原因是您正在使用$statslist[] = $statsdao->getById(1);,它在 $statslist 数组的第一个元素内创建结果。所以删除 []。

    您可以激活error_reporting(E_ALL); 以避免此类问题。这将告诉您您正在尝试附加非数组变量的元素。

    编辑: 如果数组不存在,我错误地记得 PHP 给出了这个通知。但似乎方括号符号$array[] 创建了一个数组 $array,如果它不存在的话。

    不过,error_reporting(E_ALL); 在开发环境中仍然是一个好主意。帮助您避免错误来源。

    【讨论】:

    • 第二部分是错误的。他有错误显示他在他的帖子中有一个错误!他也没有附加任何他调用非对象方法的东西:)
    • @Iznogood 他会收到通知或警告说明 $statslist 不是数组。
    • @Crashspeeder 是一个数组!一个单元素数组!
    • @Crashspeeder 你错了朋友在writecodeonline.com/php 上尝试一下,只需一分钟。 :)
    • 当使用方括号表示法时,如果它不存在,您会自动创建一个数组——看起来。 php.net/manual/en/…
    【解决方案2】:

    这样试试:

      $statsdao = new StatsDAO();
        $statslist = $statsdao->getById(1);
        foreach ($statslist as $stat) {
            echo $stat->getName();
        }
    

    你添加一个 [] ,然后将数组放入另一个数组中,从而给你

     $statslist[0][0]->getName(); //would only work on php 5.4 with this syntaxe but it shoes the idea.
    

    一层太深了。

    将另一个 foreach 放在第一个里面也可以解决它,但它很丑而且没有任何作用:

     $statsdao[] = new StatsDAO();
        $statslist = $statsdao->getById(1);
        foreach ($statslist as $stats) {
             foreach ($stats as $stat) {
                 echo $stat->getName();
             }
        }
    

    【讨论】:

    • 嵌套的 foreachs 运行良好,非常感谢!你会碰巧知道为什么会这样吗?我的意思是,如果我返回一个数组,我不明白为什么我会在一个数组中得到一个数组......
    【解决方案3】:

    你不需要括号。设置 $statslist 时。通过把括号放在你告诉 PHP 你想创建一个新数组并将第一个键 (0) 设置为 getById() 的返回值。这会产生一个数组数组。你实际上并不想要那个。

    $statsdao = new StatsDAO();
    $statslist = $statsdao->getById(1);
    foreach ($statslist as $stat) {
        echo $stat->getName();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 2014-02-26
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多