将PHP类对象传递给Javascript并在Javascript函数中访问其属性

将PHP类对象传递给Javascript并在Javascript函数中访问其属性,javascript,php,Javascript,Php,在我创建的Javascript函数中访问对象的属性时遇到问题。该对象最初是一个PHPobject,我使用JSON\u encode()将其编码为JSON 我有一个PHP文件和一个外部的JS文件 在我的PHP文件中,我有ff: <?php $announcementDaoImpl = new AnnouncementDaoImpl($pdo); $announcementList = $announcementDaoImpl->getAllAnnouncementByM

在我创建的Javascript函数中访问
对象的属性时遇到问题。该对象最初是一个PHP
object
,我使用
JSON\u encode()将其编码为
JSON

我有一个PHP文件和一个外部的JS文件

在我的PHP文件中,我有ff:

<?php
    $announcementDaoImpl = new AnnouncementDaoImpl($pdo);
    $announcementList = $announcementDaoImpl->getAllAnnouncementByMostRecent();
    foreach($announcementList as $key => $value): ?>
        <tr>
        <td><?php echo $value->getId(); ?></td>
        <td><?php echo $value->getTitle(); ?></td>
        <td><?php echo $value->getDateAdded(); ?></td>
        <?php echo json_encode($value); ?> 
        <td>
        <a href="#" onclick="showEditModal('modalBox',<?php echo json_encode($value); ?>)">Edit</a>
        </td>
        </tr>
    <?php endforeach; ?>
echoo
s
{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}
,它似乎是空对象

我的目标是能够将
$value
php
对象传递给javascript方法
showEditModal()
,然后访问方法块中对象的属性。类似于,
object.propertyname

下面是javascript方法
showEditModal()
的实现

function showEditModal(modalDivId,object){
    alert(object.title); //returns undefined

    var modalBox = document.getElementById(modalDivId);
    var modalContentValues = document.getElementById("modalContentValues");
    modalBox.style.display = "block";
    var node = document.createElement("p");
    var text = document.createTextNode(object); //shows [object Object]
    node.style.display = "inline";
    node.appendChild(text);
    modalContentValues.appendChild(node);
}
---编辑---

下面是类定义

class Announcement {
    private $id;
    private $title;
    private $content;
    private $dateAdded;


    public function getContent()
    {
        return $this->content;
    }

    public function setContent($content)
    {
        $this->content = $content;
    }

    public function getDateAdded()
    {
        return $this->dateAdded;
    }

    public function setDateAdded($dateAdded)
    {
        $this->dateAdded = $dateAdded;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }
} 
--编辑结束--

这就是我的浏览器上显示的内容

我在javascript方法中添加了一些注释,以了解更多细节

我非常感谢你的帮助

谢谢。

喜欢吗

<a href="#" onclick="showEditModal('modalBox','<?php echo json_encode($value); ?>')">Edit</a>

我敢说这是因为
json\u encode()
扫描对象的公共属性并将其放入结果中,但在代码中始终使用getter函数。如果不知道
$announcementList
中对象的类定义,就很难判断。试试这个:

<?php echo json_encode([
    'id' => $value->getId(),
    'title' => $value->getTitle(),
    'dateAdded' => $value->getDateAdded(),
]); ?>

从php代码中可以看出,您可以通过方法访问对象属性。听起来这些属性是私有的。这就是为什么当您试图对对象进行编码时,结果是一个空对象

你能做的是:

class MyObject
{
    private $attribute1;
    private $attribute2;

    public function getAttribute1()
    {
        return $this->attribute1;
    }

    public function getAttribute2()
    {
        return $this->attribute2;
    }

    public function toArray()
    {
        return [
            'attribute1' => $this->attribute1,
            'attribute2' => $this->attribute2,
        ];
    }

    public function toJson()
    {
        return json_encode($this->toArray());
    }
}
现在在php文件中,您可以像这样使用它:

<?php
    $announcementDaoImpl = new AnnouncementDaoImpl($pdo);
    $announcementList = $announcementDaoImpl->getAllAnnouncementByMostRecent();
    foreach($announcementList as $key => $value): ?>
        <tr>
        <td><?php echo $value->getAttribute1(); ?></td>
        <td><?php echo $value->getAttribute2(); ?></td>
        <td>
        <a href="#" onclick="showEditModal('modalBox',<?php echo $value->toJson() ?>)">Edit</a>
        </td>
        </tr>
    <?php endforeach; ?>

您可以实现该接口,以定义序列化对象时要使哪些属性可见;e、 g:

<?php 

class User implements \JsonSerializable
{
    private $name;

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

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

echo json_encode(new User('Bob')); // {"name":"Bob"} 

示例:

这个问题可以用以下简单的代码优雅地演示:

class Foo {
    private $a = 0;
    protected $b = 1;
    public $c = 2;
}
echo json_encode(new Foo);
// Outputs {"c":2}
给定一个标准对象,
json\u encode
将只序列化该对象的公共属性。如果您试图序列化的对象使用私有或受保护的属性,那么JSON编码器将看不到这些属性;如果对象只有这些,那么就会得到一个空的JSON对象,就像您的例子一样

如果您可以更改有问题的类,那么可以实现自定义要序列化的属性。如果不能,则需要构建自己的表示,以便使用公共getter方法传递给JavaScript,例如

echo json_encode([
      'id' => $value->getId(),
      'title' => $value->getTitle(),
      'dateAdded' => $value->getDateAdded()
]);

您试图对包含公共方法但没有公共属性的对象进行编码
json_encode
将只编码公共属性

您只需创建具有真实公共属性的对象,然后将其序列化:

<?php
    $announcementDaoImpl = new AnnouncementDaoImpl($pdo);
    $announcementList = $announcementDaoImpl->getAllAnnouncementByMostRecent();
    foreach($announcementList as $key => $value): ?>
        <tr>
        <td><?php echo $value->getId(); ?></td>
        <td><?php echo $value->getTitle(); ?></td>
        <td><?php echo $value->getDateAdded(); ?></td>
        <?php 
             $obj = new stdClass(); 
             $obj->Id = $value->getId();
             $obj->Title= $value->getTitle();
             $obj->DateAdded= $value->getDateAdded();
             var_dump($value);  // just for debugging
             var_dump($obj);    // just for debugging
             echo json_encode($obj); 
        ?> 
        <td>
        <a href="#" onclick="showEditModal('modalBox',<?php echo json_encode($obj); ?>)">Edit</a>
        </td>
        </tr>
    <?php endforeach; ?>

(第二,备选答案)您试图对包含公共方法但没有公共属性的对象进行编码
json_encode
将只编码
公共属性

使用一种不同、优雅且简单的方法创建一个新对象,该对象的公共属性“反映”了原始对象的私有属性:



谢谢您的回答。然而,我还是得到了同样的结果<在
alert()
[object object]
createTextNode(object)
上尝试了
alert(object[0].title)吗谢谢你的回答。在尝试了你的建议之后,我能够响应编码的值。但是,调用
showEditModal()
时,我的Javascript方法甚至不会显示
alert()
。我得到了那份工作。当我
echo json_encode(new Announcement())时
{id:2,“title”:“Announcement 1”,“content”:“Announcement 1 content”,“dateAdded”:“2018-04-24 14:44:27”}{id:1,“title”:“Test Announcement title”,“content”:“Test Announcement content”,“dateAdded”:“2018-04-22 16:12:06”}
你知道为什么js方法
showEditModal()
现在不会执行吗,我会检查浏览器的web developer工具栏中是否有错误。看起来您想将JS对象文本传递到
showEditModal
中,但看起来您直接传递了jsonified字符串。如果是这样,则必须使用
JSON.parse()
将字符串转换为JS对象。由于您处理的是一个字符串,因此可能还需要引用PHP代码;e、 g:
showEditModal('foo-JSON.parse('谢谢。我确实试过了,但遇到了麻烦,我猜是因为转义引号,或者可能是我做得不对。
class Foo {
    private $a = 0;
    protected $b = 1;
    public $c = 2;
}
echo json_encode(new Foo);
// Outputs {"c":2}
echo json_encode([
      'id' => $value->getId(),
      'title' => $value->getTitle(),
      'dateAdded' => $value->getDateAdded()
]);
<?php
    $announcementDaoImpl = new AnnouncementDaoImpl($pdo);
    $announcementList = $announcementDaoImpl->getAllAnnouncementByMostRecent();
    foreach($announcementList as $key => $value): ?>
        <tr>
        <td><?php echo $value->getId(); ?></td>
        <td><?php echo $value->getTitle(); ?></td>
        <td><?php echo $value->getDateAdded(); ?></td>
        <?php 
             $obj = new stdClass(); 
             $obj->Id = $value->getId();
             $obj->Title= $value->getTitle();
             $obj->DateAdded= $value->getDateAdded();
             var_dump($value);  // just for debugging
             var_dump($obj);    // just for debugging
             echo json_encode($obj); 
        ?> 
        <td>
        <a href="#" onclick="showEditModal('modalBox',<?php echo json_encode($obj); ?>)">Edit</a>
        </td>
        </tr>
    <?php endforeach; ?>
   <?php
   $announcementDaoImpl = new AnnouncementDaoImpl($pdo);
   $announcementList = $announcementDaoImpl->getAllAnnouncementByMostRecent(); 
   foreach($announcementList as $key => $value): ?>
        <tr>
        <td><?php echo $value->getId(); ?></td>
        <td><?php echo $value->getTitle(); ?></td>
        <td><?php echo $value->getDateAdded(); ?></td>
        <?php
             // gets all PRIVATE properties of $value and stores them to $obj 
             $reflect = new ReflectionClass($value);
             $obj = $reflect->getProperties(ReflectionProperty::IS_PRIVATE);

             echo json_encode($obj); 
        ?> 
        <td>
        <a href="#" onclick="showEditModal('modalBox',<?php echo json_encode($obj); ?>)">Edit</a>
        </td>
        </tr>
    <?php endforeach; ?>