Подтвердить что ты не робот

Структурирует тип данных в php?

Может ли кто-нибудь дать мне пример для типа данных structs в php? Как получилось что-то вроде структур в php внезапно?

4b9b3361

Ответ 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, поэтому вам может понадобиться использовать классы или просто жить без них.

Примечание: Помните, что вы должны проверить/санировать данные в другом месте кода, чтобы соответствовать комментарию.