比方说,我有一个javascript对象数组,如下所示。
let users = [
{
'id' => 1,
'name' => 'John',
'amount' => 1000,
},
{
'id' => 2,
'name' => 'Smith',
'amount' => 2000,
},
];
现在,我如何在PHP中创建相同的对象并执行CRUD操作?
注意:我知道应该是:而不是=>。我只是想让它看起来更像PHP。
PHP中的通用键值数据结构不是对象,而是关联数组。你的代码看起来是这样的:
$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的内置功能,该功能是围绕关联数组设计的。
另一方面,如果每个对象中都有相同的字段,则应该声明一个列出这些字段的类。这将为您提供更好的性能、更好的错误处理、更清晰的代码,以及将来在这些类中封装逻辑的能力。
在PHP8中,您可以使用构造函数属性提升来编写此代码,如下所示:
class User
{
public function __construct(
public int $id,
public string $name,
public int $amount
) {}
}
然后创建这样的数组(使用命名参数,也是PHP8.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)
}
}
我认为还值得一提的是使用json_decode
的快速和肮脏方式
只需用引号包装您的JavaScript声明:
$users = json_decode(
'[
{
"id": 1,
"name": "John",
"amount": 1000
},
{
"id": 2,
"name": "Smith",
"amount": 2000
}
]'
);
示例