如何在php中创建类似javascript的对象

问题描述

比方说,我有一个如下所示的 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
    }
]'
);

example

,

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)
  }
}