【问题标题】:How to create javascript like object in php如何在 php 中创建类似 javascript 的对象
【发布时间】:2021-06-16 14:19:56
【问题描述】:

比方说,我有一个像下面这样的 javascript 对象数组。

    let users = [
        {
            'id' => 1,
            'name' => 'John',
            'amount' => 1000,
        },
        {
            'id' => 2,
            'name' => 'Smith',
            'amount' => 2000,
        },
    ];

现在如何在 PHP 中创建相同的对象并进行 CRUD 操作?

注意:我知道它应该是:而不是 =>。我只是想让它看起来更像 PHP。

【问题讨论】:

  • 实际上你必须使用冒号 (:) 而不是等号 (=)
  • 是的,我知道,我只是想让它看起来更像 PHP

标签: php arrays object php-8


【解决方案1】:

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 中,声明类和创建对象的代码会略有不同,但好处是一样的。

【讨论】:

  • PHP8 有很多很棒的功能,大家应该升级。
【解决方案2】:

我认为还值得一提的是使用json_decode

又快又脏的方式

只需将您的 JavaScript 声明用引号括起来:

$users = json_decode(
'[
    {
        "id": 1,
        "name": "John",
        "amount": 1000
    },
    {
        "id": 2,
        "name": "Smith",
        "amount": 2000
    }
]'
);

example

【讨论】:

  • 你能举个crud操作的例子吗?
  • 和我的回答一样。这段代码完全一样。
【解决方案3】:

您可以将数组转换为对象。

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

【讨论】:

  • 更新了 CRUD 示例的答案。
  • 虽然这很有效,并且对于 JS 开发人员来说会觉得很熟悉,但我建议不要养成这种习惯,并且个人很高兴看到这个功能从语言中删除。如果您有动态键,只需使用数组;如果你有固定的键,声明一个类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多