PHP中有类似结构数据类型的东西吗?谁能给我一个结构数据类型的例子来更好地理解这一点?
如果没有这样的数据类型,我怎样才能得到一个行为像结构的数据类型?
原文由 ktm 发布,翻译遵循 CC BY-SA 4.0 许可协议
PHP中有类似结构数据类型的东西吗?谁能给我一个结构数据类型的例子来更好地理解这一点?
如果没有这样的数据类型,我怎样才能得到一个行为像结构的数据类型?
原文由 ktm 发布,翻译遵循 CC BY-SA 4.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 许可协议
2 回答1.5k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
2 回答862 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
2 回答920 阅读
1 回答903 阅读
1 回答833 阅读
最接近结构的是所有成员都公开的对象。
我会说看看 PHP 类文档 是值得的。如果您需要一次性结构, 请使用 Alex 的回答中提到的 StdObject 。