【问题标题】:PHP Error: Cannot use object of type stdClass as array (array and object issues) [duplicate]PHP错误:不能将stdClass类型的对象用作数组(数组和对象问题)[重复]
【发布时间】:2013-05-11 10:58:24
【问题描述】:

我试图复制这段代码:

<?php
foreach ($products as $product) {
    $id          = $product['id'];
    $name        = $product['name'];
    $description = $product['description'];
    $price       = $product['price'];
?>
    <tr>
    <td><img src="<?php echo $product['picture']; ?>" /></td>
        <td><b><?php echo $name; ?></b><br />
        <?php echo $description; ?><br />
          Price:<big style="color:green">
          $<?php echo $price; ?></big><br /><br />
<?php
    echo form_open('cart/add');
    echo form_hidden('id', $id);
    echo form_hidden('name', $name);
    echo form_hidden('price', $price);
    echo form_submit('action', 'Add to Cart');
    echo form_close();
?>
    </td>
    </tr>
    <tr><td colspan="2"><hr size="1" /></td>
<?php
}
?>

这是我的代码:

<?php
   foreach ($blogs as $blog) {
      $id      = $blog['id'];
      $title   = $blog['title'];
      $content = $blog['content'];
?>
      <h1><?php echo $title; ?></h1>
      <h1> <?php echo $content; ?> </h1>

<?php
}
?>

每次运行代码时都会出现此错误:“不能将 stdClass 类型的对象用作数组”

【问题讨论】:

  • 尝试使用对象语法:$blog-&gt;id
  • 好吧 $blog 似乎是一个对象。只需 print_r() 您的 $blogs 即可查看其结构
  • 尝试使用->操作符
  • 愚蠢地标记为重复。链接的“重复”问题是关于使用 json_decode 返回一个数组(而不是它的默认对象)。

标签: php arrays object


【解决方案1】:

$blog 是一个对象而不是数组

尝试使用$blog-&gt;id 而不是$blog['id']

【讨论】:

    【解决方案2】:

    $blog 是一个对象,而不是一个数组,所以你应该像这样访问它:

    $blog->id;
    $blog->title;
    $blog->content;
    

    【讨论】:

      【解决方案3】:

      可能有两个问题

      1) $blogs may be a stdObject
      

      2) The properties of the array might be the stdObject
      

      尝试使用 var_dump($blogs) 看看实际问题,如果数组的属性有 stdObject 试试这样

      $blog->id;
      $blog->content;
      $blog->title;
      

      【讨论】:

      • 一个快速的 var_dump() 可能是有序的。
      【解决方案4】:

      如果您迭代的是对象而不是数组,则需要使用以下方法访问属性:

      $id = $blog->id;
      $title = $blog->title;
      $content = $blog->content;
      

      那个,或者把你的对象改成一个数组。

      【讨论】:

      • 我希望我的代码看起来就像我复制代码的位置一样。为什么我必须这样改变它?我复制的代码不是错了吗?
      【解决方案5】:

      您复制的示例是使用包含数组的数组形式的数据,您正在使用包含对象的数组形式的数据。对象和数组并不相同,因此它们使用不同的语法来访问数据。

      如果您不知道变量名称,只需在循环中执行 var_dump($blog); 即可查看它们。

      最简单的方法——直接作为对象访问$blog:

      尝试(假设这些变量是正确的):

      <?php 
          foreach ($blogs as $blog) {
              $id         = $blog->id;
              $title      = $blog->title;
              $content    = $blog->content;
      ?>
      
      <h1> <?php echo $title; ?></h1>
      <h1> <?php echo $content; ?> </h1>
      
      <?php } ?>
      

      替代方法 - 以数组形式访问 $blog:

      或者,您可以将$blog 转换为带有get_object_vars (documentation) 的数组:

      <?php
          foreach($blogs as &$blog) {
              $blog     = get_object_vars($blog);
              $id       = $blog['id'];
              $title    = $blog['title'];
              $content  = $blog['content'];
      ?>
      
      <h1> <?php echo $title; ?></h1>
      <h1> <?php echo $content; ?> </h1>
      
      <?php } ?> 
      

      值得一提的是,这不一定适用于嵌套对象,因此它的可行性完全取决于您的 $blog 对象的结构。

      优于上述任何一种 - 内联 PHP 语法

      说了这么多,如果你想以最易读的方式使用 PHP,以上都不是正确的。当 PHP 与 HTML 混合使用时,许多人认为最好的做法是使用 PHP 的 alternative syntax,这会将整个代码从 9 行减少到 4 行:

      <?php foreach($blogs as $blog): ?>
          <h1><?php echo $blog->title; ?></h1>
          <p><?php echo $blog->content; ?></p>
      <?php endforeach; ?>
      

      希望这会有所帮助。

      【讨论】:

      • 然而,php 手册说您可以对对象使用数组表示法。那么,为什么我们必须使用“->”呢?
      • @e-motiv 是的,我目前面临同样的问题:php.net/manual/en/sdo.sample.getset.php
      【解决方案6】:

      使用-&gt;访问StdClass对象

      foreach ($blogs as $blog) {
          $id         = $blog->id;
          $title  = $blog->title;
          $content    = $blog->content;
      }
      

      【讨论】:

      • 是的......但我想知道为什么我不能复制上面的代码。像这样 foreach ($blogs as $blog) { $id = $blog['id']; $title = $blog['title']; $content = $blog['content']; ?>

      • @EmmanuelJosephUBastero - 您无法复制代码,因为它们正在处理数组数组,而您正在处理对象数组。这就像问为什么你不能复制别人如何驾驶独轮车一样,它们是完全不同的工具。我在回答中解释了如何将你的对象变成数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2011-10-12
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多