Может ли кто-нибудь дать мне пример для типа данных structs в php? Как получилось что-то вроде структур в php внезапно?
Структурирует тип данных в php?
Ответ 1
Ближе всего вы дойдете до структуры - это объект со всеми публичными членами.
class MyStruct {
public $foo;
public $bar;
}
$obj = new MyStruct();
$obj->foo = 'Hello';
$obj->bar = 'World';
Я бы сказал, глядя на Документация PHP-класса. Если вам нужна разовая структура, используйте StdObject, как указано в ответе alex.
Ответ 2
Вы можете использовать массив
$something = array(
'key' => 'value',
'key2' => 'value2'
);
или со стандартным объектом.
$something = new StdClass();
$something->key = 'value';
$something->key2 = 'value2';
Ответ 3
Я рекомендую 2 вещи. Сначала ассоциативный массив.
$person = Array();
$person['name'] = "Joe";
$person['age'] = 22;
Второй - классы.
Подробная документация здесь: http://php.net/manual/en/language.oop5.php
Ответ 4
Сегодня я собрал "динамический" класс структуры, посмотрел сегодня вечером, и кто-то написал что-то подобное с лучшей обработкой параметров конструктора, может быть стоит посмотреть:
http://code.activestate.com/recipes/577160-php-struct-port/
В одном из комментариев на этой странице упоминается интересная вещь в PHP - видимо, вы можете отливать массив как объект, который позволяет ссылаться на элементы массива с помощью обозначения стрелки, как и с указателем Struct в C. Пример комментария был следующим:
$z = array('foo' => 1, 'bar' => true, 'baz' => array(1,2,3));
//accessing values as properties
$y = (object)$z;
echo $y->foo;
Я еще не пробовал это сам, но может быть, вы могли бы получить желаемую нотацию, просто нажав - если это все, что вам нужно. Это, конечно, "динамические" структуры данных, просто синтаксический сахар для доступа к парам ключ/значение в хеше.
Если вы действительно ищете что-то более статически типизированное, тогда ответ ASpencer - это дроид, который вы ищете (как мог бы сказать Оби-Ван).
Ответ 5
Кажется, что тип struct
обычно используется в SOAP:
var_dump($client->__getTypes());
array(52) {
[0] =>
string(43) "struct Bank {\n string Code;\n string Name;\n}"
}
Это не родной тип данных PHP!
Похоже, что свойства типа struct
, упоминаемые в SOAP, могут быть доступны как простой объект PHP stdClass
:
$some_struct = $client->SomeMethod();
echo 'Name: ' . $some_struct->Name;
Ответ 6
В PHP есть только ассоциативные массивы.
И вы не можете сделать их строгими сами по себе.
Но с классами и интерфейсами вы можете разобраться в строгости строгой структуры, но имейте в виду, что в отличие от структур, экземпляры классов не передаются в аргументах, их идентификаторы!
Вы можете определить структуру через интерфейс (или, по крайней мере, близко к нему)
Структуры обеспечивают определенную структуру объекта.
PHP (& lt; = 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 - через его конструктор
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
* @property Foo $foo
* @property Bar $bar
*/
interface My
{
}
/**
* Interface Foo
* @property string|integer $id
* @property string $name
*/
interface Foo
{
}
/**
* Interface Bar
* @property integer $id
*/
interface Bar
{
}
Причина использования интерфейсов вместо классов по той же причине, по которой интерфейсы существуют в первую очередь, потому что тогда многие классы с множеством реализаций могут иметь такую же структуру, и каждый метод/функция, которая их использует, будет поддерживать каждый класс с этим интерфейс.
Это зависит от вашей IDE, поэтому вам может понадобиться использовать классы или просто жить без них.
Примечание: Помните, что вы должны проверить/санировать данные в другом месте кода, чтобы соответствовать комментарию.