问题描述
比方说,我有一个如下所示的 javascript 对象数组。
let users = [
{
'id' => 1,'name' => 'John','amount' => 1000,},{
'id' => 2,'name' => 'Smith','amount' => 2000,];
现在如何在 PHP 中创建相同的对象并进行 CRUD 操作?
注意:我知道它应该是:而不是 =>。我只是想让它看起来更像 PHP。
解决方法
我认为还值得一提的是使用 json_decode
只需将您的 JavaScript 声明用引号括起来:
$users = json_decode(
'[
{
"id": 1,"name": "John","amount": 1000
},{
"id": 2,"name": "Smith","amount": 2000
}
]'
);
,
PHP 中的通用键值数据结构不是对象,而是 associative array。您的代码如下所示:
$users = [
[
'id' => 1,'name' => 'John','amount' => 1000,],[
'id' => 2,'name' => 'Smith','amount' => 2000,];
然后您可以使用方括号访问元素:
$users[0]['amount'] = 0;
$users[1]['amount'] = 3000;
echo $users[0]['amount'];
虽然为此使用对象对于 JS 开发人员来说可能更熟悉,但将数组用于临时数据将使您能够使用更多 PHP 的 built-in functionality,它是围绕关联数组设计的。
另一方面,如果您实际上在每个对象中都有相同的字段,您应该declare a class 列出这些字段。这将为您提供更好的性能、更好的错误处理、更清晰的代码以及将来在这些类中封装逻辑的能力。
在 PHP 8 中,您可以使用 constructor property promotion 编写它,如下所示:
class User
{
public function __construct(
public int $id,public string $name,public int $amount
) {}
}
然后您将像这样创建数组(使用命名参数,也是 PHP 8.0 中的新参数):
$users = [
new User(
id: 1,name: 'John',amount: 1000,),new User(
id: 2,name: 'Smith',amount: 2000,];
像这样使用它:
$users[0]->amount = 0;
$users[1]->amount = 3000;
echo $users[0]->amount;
在旧版本的 PHP 中,声明类和创建对象的代码必须略有不同,但好处是相同的。
,您可以将数组转换为对象。
$users = [
(object)[
'id' => 1,'name' => 'John','amount' => 1000
],(object)[
'id' => 2,'name' => 'Smith','amount' => 2000
],];
// create
$users[] = (object)['id' => 3,'name' => 'Joe','amount' => 3000];
// read
echo $users[2]->name;
// update
$users[2]->name = 'FooBar';
// delete
unset($users[2]);
array(2) {
[0] =>
class stdClass#1 (3) {
public $id =>
int(1)
public $name =>
string(4) "John"
public $amount =>
int(1000)
}
[1] =>
class stdClass#2 (3) {
public $id =>
int(2)
public $name =>
string(5) "Smith"
public $amount =>
int(2000)
}
}