将PHP类对象传递给Javascript并在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
对象的属性时遇到问题。该对象最初是一个PHPobject
,我使用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; ?>