如何在 php 中创建类似 javascript 的对象
How to create javascript like object in php
比方说,我有一个 javascript 对象数组,如下所示。
let users = [
{
'id' => 1,
'name' => 'John',
'amount' => 1000,
},
{
'id' => 2,
'name' => 'Smith',
'amount' => 2000,
},
];
现在如何在 PHP 中创建相同的对象并进行 CRUD 操作?
注意:我知道应该是 : 而不是 =>。我只是想让它看起来更像 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)
}
}
我认为使用 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 的旧版本中,声明 类 和创建对象的代码必须略有不同,但好处是相同的。
比方说,我有一个 javascript 对象数组,如下所示。
let users = [
{
'id' => 1,
'name' => 'John',
'amount' => 1000,
},
{
'id' => 2,
'name' => 'Smith',
'amount' => 2000,
},
];
现在如何在 PHP 中创建相同的对象并进行 CRUD 操作?
注意:我知道应该是 : 而不是 =>。我只是想让它看起来更像 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)
}
}
我认为使用 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 的旧版本中,声明 类 和创建对象的代码必须略有不同,但好处是相同的。