PHP中只有关联数组是结构。
而且您不能对它们进行严格限制。
但是您可以使用类和接口对结构进行严格的伪造,但是要注意,与结构不同,类实例不会在参数中传递,它们的标识符是!
您可以通过接口(或至少靠近接口)定义结构
结构在对象上强制执行某种结构。
PHP(<= 7.3)没有本机结构,但是您可以使用接口和类型提示来解决它:
interface FooStruct
{
public function name() : string;
}
interface BarStruct
{
public function id() : int;
}
interface MyStruct
{
public function foo() : FooStruct;
public function bar() : BarStruct;
}
任何实现的类MyStruct都是MyStruct。
它的构建方式不取决于结构,它只是确保返回的数据正确。
设置数据呢?
设置结构数据是有问题的,因为我们最终会遇到吸气剂和设置器,并且它很接近贫血对象或DTO,并且被某些人认为是反模式
错误的例子:
interface FooStruct
{
public function getName() : string;
public function setName(string $value) : FooStruct;
}
interface BarStruct
{
public function getId() : int;
public function setId(int $value) : BarStruct;
}
interface MyStruct
{
public function getFoo() : FooStruct;
public function setFoo(FooStruct $value) : MyStruct;
public function getBar() : BarStruct;
public function setBar(BarStruct $value) : MyStruct;
}
然后,我们最终得到了可能是可变的类实现,并且一个结构不得突变,这是使其成为“数据类型”,就像int,一样string。但是,没有办法用PHP中的接口来限制它,这意味着人们将能够在不是结构的类中实现结构接口。确保实例保持不变
然后,在没有正确数据的情况下可以实例化结构,并在尝试访问数据时触发错误。
在PHP struct类中设置数据的一种简单可靠的方法是通过其构造函数
interface FooStruct
{
public function name() : string;
}
interface BarStruct
{
public function id() : int;
}
interface MyStruct
{
public function foo() : FooStruct;
public function bar() : BarStruct;
}
class Foo implements FooStruct
{
protected $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function name() : string
{
return $this->name;
}
}
class Bar implements BarStruct
{
protected $id;
public function __construct(string $id)
{
$this->id = $id;
}
public function id() : int
{
return $this->id;
}
}
class My implements MyStruct
{
protected $foo, $bar;
public function __construct(FooStruct $foo, BarStruct $bar)
{
$this->foo = $foo;
$this->bar = $bar;
}
public function foo() : FooStruct
{
return $this->foo;
}
public function bar() : BarStruct
{
return $this->bar;
}
}
使用接口键入提示:(如果您的IDE支持)
如果您不介意不进行严格的类型检查,那么另一种方法是将带有注释的接口或类用于IDE。
interface My
{
}
interface Foo
{
}
interface Bar
{
}
之所以使用接口而不是类,是因为接口之所以首先存在,是因为具有许多实现的许多类可以具有相同的结构,并且使用该接口的每个方法/函数都将支持具有此接口的每个类。
这取决于您的IDE,因此您可能需要改用类,或者只使用类而不使用它。
注意:请记住,您必须在代码中其他地方验证/清除实例中的数据以匹配注释。
struct数据类型。