PHP 有 struct 数据类型吗?

新手上路,请多包涵

PHP中有类似结构数据类型的东西吗?谁能给我一个结构数据类型的例子来更好地理解这一点?

如果没有这样的数据类型,我怎样才能得到一个行为像结构的数据类型?

原文由 ktm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

最接近结构的是所有成员都公开的对象。

 class MyStruct {
    public $foo;
    public $bar;
}

$obj = new MyStruct();
$obj->foo = 'Hello';
$obj->bar = 'World';

我会说看看 PHP 类文档 是值得的。如果您需要一次性结构, 请使用 Alex 的回答中提到的 StdObject

原文由 ASpencer 发布,翻译遵循 CC BY-SA 3.0 许可协议

这在谷歌上相当高,所以我想我会分享我使用 PHP8 语法实现的伪结构。 toArray() 方法确实依赖 Illuminate\Support\Str 将键转换为蛇形案例(对于 Laravel 模型的质量分配很有用),但是如果它不适合您的用例,只需将其删除。

基类:

 <?php

namespace App\Infrastructure\Structs;

use App\Infrastructure\Exceptions\CannotMutateStructException;
use App\Infrastructure\Exceptions\ClassPropertyNotFoundException;
use Illuminate\Support\Str;
use ReflectionClass;

abstract class Struct
{
    /**
     * @param string $name
     * @param mixed $value
     * @throws CannotMutateStructException
     */
    public function __set(string $name, mixed $value): void
    {
        throw new CannotMutateStructException(
            'Structs are immutable. If you need mutable data then use a class instead.'
        );
    }

    public function all(): array
    {
        $reflector = new ReflectionClass(static::class);
        $response = [];

        foreach ($reflector->getProperties() as $property) {
            $response[$property->name] = $this->{$property->name};
        }

        return $response;
    }

    public function toArray(bool $snakeCase = false): array
    {
        $all = self::all();

        if ($snakeCase === false) {
            return $all;
        }

        $snakeCaseAll = [];

        foreach ($all as $key => $value) {
            $snakeCaseAll[Str::snake($key)] =  $value;
        }

        return $snakeCaseAll;
    }
}

如何使用:

 <?php

namespace App\Infrastructure\Structs;

class Person extends Struct
{
    public function __construct(
        public string $name,
        public int $age,
        public int $heightInCentimetres,
    ) {}
}

如何与之交互:

 >>> $t = new \App\Infrastructure\Structs\Person('Max', 26, 182);

>>> $t->age
=> 26

>>> $t->age = 40
App\Infrastructure\Exceptions\CannotMutateStructException with message 'Structs are immutable. If you need mutable data then use a class instead.'

>>> $t->toArray(true)
=> [
     "name" => "Max",
     "age" => 26,
     "height_in_centimetres" => 182,
   ]

希望这可以帮助某人。

编辑:使用 PHP8.1,我们现在拥有 只读属性,这可以使它更加简洁。

编辑:使用 PHP8.2,我们现在有一种 简洁的方法。我强烈建议您完整阅读这篇文章以获得一个很好的例子: https ://stitcher.io/blog/evolution-of-a-php-object

然而,一般的 jist 是写 readonly class Foo {} 删除需要针对每个属性添加它。

原文由 Max 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题