如何从JavaScript中访问PHP对象数组中的PHP对象属性

3

我有一个 PHP 对象数组。在一个 JavaScript 函数中,我想访问数组中一个对象的属性。如果我使用 json_encode 编码整个数组,显示这些属性是 undefined 的。我该如何做?我是 PHP 初学者。

PHP 代码:

$_SESSION['objArray'] = $objArray;

Javascript 代码:

const objArray = <?php echo json_encode(($_SESSION['objArray'])) ?>;

你尝试过什么吗? - xMayank
你能贴一些你写过的代码吗? - Nikster2014
我编辑了问题以显示代码。解决这个问题会很有帮助。$objArray是具有PHP对象的数组。 - Poorna
2个回答

1

你需要对数组进行JSON编码,以便JavaScript客户端可以使用。

正如你提到的,你的数组中有特定类的实例,因此简单的JSON编码肯定行不通。

在这里,PHP提供了JsonSerializable接口。你需要在你的类上实现这个接口。让我们以Foo为例:

class Foo implements JsonSerializable
{
  private $thing;

  public function __construct($thing)
  {
    $this->thing = $thing;
  }

  public function jsonSerialize()
  {
    return [
      'thing' => $this->thing,
    ];
  }
} 

这里是上面代码片段的一个示例。正如您所看到的,现在您可以创建一个Foo实例,将其嵌入到数组或其他任何东西中,并使用自己的表示形式进行JSON编码:

$foo = new Foo('something');
echo json_encode(['foo' => $foo]);

// {"foo": {"thing": "something"}}

将此输出到内联JavaScript块中,类似于您编写的方式:

<script type="application/javascript">
const obj = "<?php echo json_encode(($_SESSION['objArray'])) ?>;";
</script>

我尝试了,但是显示出来的是:“声望低于15的用户投票会被记录,但不会改变公开显示的帖子分数。” 我相对比较新。 - Poorna

0

将 PHP 数组存储到 JavaScript 变量中,

示例值:$_SESSION['objArray'] 中的示例数组)

$_SESSION['objArray'] = array(
    'name' => 'foo',
    'email' => 'foo@gmail.com',
    'age' => 30
);

将对象转换为数组:(可选)(如果您在$_SESSION['objArray']中有对象值)

$_SESSION['objArray'] = json_decode(json_encode($_SESSION['objArray']), true);

解决方案:(将其赋值给JavaScript变量objArray)
<script>
    const objArray = "<?php echo json_encode($_SESSION['objArray']); ?>";
    console.log(objArray);
</script>

控制台输出:

{"name":"foo","email":"foo@gmail.com","age":30}

解释:json_encode函数将数组转换为json字符串,而javascript会将其视为字符串,在赋值时需要用引号括起来,可以使用单引号'或双引号"

希望这能帮到你。


您提供的数组是键值对的形式,但我手上的数组包含特定类的对象。而这些对象包含在它们内部的属性。我需要访问这些属性。 - Poorna
@turivishal 那很靠不住 - Victor
嗨@victor,我不明白你的意思,请你能否解释一下。 - turivishal
@turivishal 我尝试了这种方法,但是无法使其工作。在JavaScript的objArray中显示为2D数组,但内部数组没有属性。 - Poorna
1
通过使用json_decode(json_encode()),您无法控制对象的序列化。您依赖于PHP在使用此功能时的行为。我会诚实地称其为hack。除此之外,序列化和反序列化JSON是相当慢的操作,因此我们不应该只为了将其反转而执行一次。 - Victor
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接