【问题标题】:PHP - Possible to call member function of object stored in an array?PHP - 可以调用存储在数组中的对象的成员函数吗?
【发布时间】:2011-04-13 22:23:37
【问题描述】:

我是 PHP 新手,花了一些时间寻找一个类似的问题,但似乎没有人能完全回答我。

我有一个对象数组(我创建的一个名为 StatusMessage 的类),我想访问数组中每个对象的成员函数。我可以使用 foreach 循环来做到这一点,但我只需要访问前 10 个对象(它们已排序),所以我尝试使用 for 循环。当我进行成员函数调用时,我收到一个关于无法在非对象上调用成员函数的致命错误。 $statObjs 中的 StatusMessage 对象是否需要强制转换?

有什么建议吗?

function collectStatuses($statusesAPI){

    $statusObjects = Array();   
    foreach($statusesAPI as $status)
    {
      //StatusMessage is a class I created
    array_push($statusObjects, new StatusMessage($status));             
    }           
    return $statusObjects;
}

//$statutuses[data] was populated further up
$statObjs = collectStatuses($statuses[data]);

//This loop works, but prints all StatusMessage objects in $statObjs 
foreach ($statObjs as $value) {
  //getInteractions() and getMessages() are both member functions of the StatusMessage class I created.
  echo '[' . $value->getInteractions() . '] ' .  $value->getMessage();
}

//This loop doesn't work. Throws the error mentioned above
for ($i = 0; $i < 10; $i++) {

  echo '[' . $statObjs[$i]->getInteractions() . '] ' .  $statObjs[$i]->getMessage();
}

【问题讨论】:

  • 感谢您指出缺少的 $s。我试图清理这篇文章的代码并完成了它。但是,在实际代码中,没有缺少美元符号。在尝试调用成员函数时,我收到的唯一错误是在 for 循环内。
  • 那么这可能是@Chris 所说的,并且数组中的对象少于 10 个。之前执行print_r($statObjs)echo count($statObjs) 并检查。
  • 我遇到了这个确切的问题。你有想过吗?每个人的答案似乎都表明您的对象数组中可能没有 10 个项目,但我认为不是这样。我有一个数组,其中只有一个对象,我无法使用 $arr[0] 或 current($arr) 访问它的成员函数——只有当我使用 foreach 时。

标签: php


【解决方案1】:

有时值得编写一个简单的测试,保存到一个单独的文件,然后从命令行通过 PHP 解释器运行脚本。在调试复杂的代码时,很容易找出错误的树。如果您有雄心壮志,可以更进一步,探索使用 PHPUnit 编写单元测试。

<?php

$statuses = array(
    'test1', 
    'test2', 
    'test3', 
    'test4', 
    'test5', 
    'test6', 
    'test7', 
    'test8',
    'test9',
    'test10',
    'test11'
);


class StatusMessage {
    private $status;
    function __construct($status) {
        $this->status = $status;
    }

    function getInteractions() {
        return $this->status . " interactions";
    }

    function getMessage() {
        return $this->status . " messages";
    }

}

function collectStatuses($statusesAPI){

    $statusObjects = Array();   
    foreach($statusesAPI as $status)
    {
      //StatusMessage is a class I created
    array_push($statusObjects, new StatusMessage($status));             
    }           
    return $statusObjects;
}

//$statutuses[data] was populated further up
$statObjs = collectStatuses($statuses);

//This loop works, but prints all StatusMessage objects in $statObjs 
foreach ($statObjs as $value) {
    //getInteractions() and getMessages() are both member functions of the StatusMessage class I created.
    echo '[' . $value->getInteractions() . '] ' .  $value->getMessage() . "\n";
}

//This loop doesn't work. Throws the error mentioned above
for ($i = 0; $i < 10; $i++) {
    echo '[' . $statObjs[$i]->getInteractions() . '] ' .  $statObjs[$i]->getMessage() . "\n";
}
?>

【讨论】:

    【解决方案2】:

    那是实际的代码吗?有几个错误。

    最后一个循环中的三个“i”变量缺少美元符号。

    $i<10
    $statObjs[$i]->
    $statObjs[$i]->
    

    当您想增加 $i ($i++) 时,您正在增加 $j

    另外,如果没有 10 条状态消息,您可能需要计算 $i

    希望这会有所帮助,

    克里斯

    【讨论】:

    • 关于对象数量的要点。但是,$statObjs.length 是 JavaScript,而不是 PHP。你必须做count($statObjs)。我没看到$j,我想你看错了。
    • 我认为他编辑了代码,因为美元符号现在在,并且 $j 已切换到 $i。
    • 不,我之前也没有看到$j。但是,是的,他添加了美元符号。
    【解决方案3】:

    我也建议在循环中尝试一下

    $statusObject = $statObjs[$i];
    print_r($statusObject); 
    

    然后可能运行 a 来查看对象是否真的在那里。有时我觉得当您直接从数组中引用对象引用时,php 不会将对象引用视为第一类对象,这与您习惯使用的 java 或其他语言不同;)。

    这也使您的实验更加科学,因为您直接引用了一个 $variable,而没有在其末尾添加 $variable['ArrayFluff']。

    for ($i = 0; $i < 10; $i++) {
      $statusObject = $statObjs[$i];
      echo '[' . $statusObject->getInteractions() . '] ' .  $statusObject->getMessage();
    //I'm fairly confident this will work =]
    }
    

    【讨论】:

      【解决方案4】:

      您所说的问题似乎向我表明该数组并未一直设置为 10。您是否还收到未定义的关键通知(error_reporting(E_ALL) 进行检查)。

      如果是这个问题,你可以使用array_slice()来获取你需要的子数组:

      foreach (array_slice($statObjs, 0, 10) as $obj) {
         echo "[{$obj->getInteractions()}] {$obj->getMessage()}";
      }
      

      即使$statObjs 的索引小于 10,array_slice 也会返回它。否则,它只返回前 10 个。

      【讨论】:

        【解决方案5】:

        既然您已将我在上一篇文章中提出的建议纳入其中,那么该代码现在可以为我工作了。您使用的是 PHP 5 或更高版本吗?

        【讨论】:

          猜你喜欢
          • 2010-12-02
          • 2014-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-27
          • 2014-03-15
          • 1970-01-01
          相关资源
          最近更新 更多