За последние 24 часа нас посетил 21931 программист и 984 робота. Сейчас ищут 659 программистов ...

PHP и структуры

Тема в разделе "Прочие вопросы по PHP", создана пользователем Sergey108, 9 авг 2016.

?

Нужны ли PHP структуры?

  1. да

    5 голосов
    83,3%
  2. нет

    1 голосов
    16,7%
  1. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    Всем привет.

    Как обычно занимался своими делами и наткнулся на необходимость создать некую структуру со строго определенными полями.
    Окей, думаю я, что бы не плодить бестолковый класс в отдельном файле, определю анонимный класс и будет мне счастье.
    И тут вспомнил Pascal/C/C++/C#/etc. Структуры! Где же вы? Как же было бы круто щас создать именованную структуру, и получить/вернуть ее можно с тайпхинтом. Погуглил RFC - нету!

    Так вот, если есть тут единомышленники, присоединяйтесь, будем делать RFC, один я не справлюсь.
     
    romach нравится это.
  2. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    А приведи пример для тех, кто не знаком со структрами. мои познания паскаля, делфи с годами теряются
     
  3. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    В Си структура определяется так
    PHP:
    1. struct Structure
    2. {
    3.     public int field = 0; // поле структуры
    4.     // конструктор
    5.     public Structure(int num)
    6.     {
    7.         this->field = num;
    8.     }
    9. }
    10. Structure myStructure(25);
    11. myStructure.field; // <-- 25
    Помимо конструктора, в структуре можно определить любой другой метод.
    Структуры относятся к типам-значений (на ряду с интами, чарами итд), т.е. размещается структура в стеке.
    По сути, структура это класс лишенный возможности наследования, но, например, в C# структура может реализовывать интерфейс.
     
  4. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Как ты собрался инкапсулировать структуру, если я к примеру начну вмешиваться в процесс и изменять ее динамически добавляя: свойства, методы и изменять поведение?
    Есть такая штука может поможет.
    Давай осваиваться на том, для каких целей тебе это нужно и что ты пытаешься добиться от php?
    Может все же будет проще создать динамический класс (структуру) - финализировать и инкапсулировать ее.
     
    maxycwebber нравится это.
  5. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    поддерживаю
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    хех... это ж мечта! Ещё она должна быть с сильной типизацией, что бы пыхомашина могла все это аккуратно и компактно разложить в памяти без лишнего оверхеда. В свое время пришлось писать сервис на go, т.к. пых на той же задаче отожрал неприлично много оперативки, а go уложился в приемлемые 50 мегабайт, что было даже меньше, чем я расчитывал.
     
  7. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    Как ты добавишь метод??
    Структуры чаще всего нужны, что бы объединить несколько полей. Как DTO'шки. К тому же, с инкапсуляцией проблем нет, поля можно сделать приватными и определить геттеры/сеттеры.
    Я хочу сделать альтернативу массиву с фиксированной структурой. Щас поясню. Вернув массив, я по сути не знаю какие там в нем данные, IDE'шка мне не подскажет. Но, если вернуть структуру, где каждое поле четко регламентировано, я буду точно знать какие данные мне доступны!
    На данный момент так и есть. Проще создать класс, который будет висеть в глобальной области видимости все время жизни приложения, и который будет использован в паре мест в 1-2 классах.
    Это как история с генераторами. Без них можно (юзай итераторы), но с ними гораздо удобнее. Так же и структуры, как альтернатива классам.
    --- Добавлено ---
    Ну вот подождем когда сделают typed properties, без них и мечтать не стоит о таком.
     
  8. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Что это будет за структура такая, которая даже калбеки не поддерживает? Что если в массиве прилетит набор анонимных функций, что тогда, запретить юзать и урезать на хер возможности замыканий?

    Если ты будешь делать это динамически - то не так ,не так тебе среда не подскажет, что ты делал или делаешь.
    Ты будешь видеть только как собирается структура и по какому принципу работает ее алгоритм (который ты собственно хочешь реализовать).
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    эм... ты ж в курсе что такое структура, да?
     
  10. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
  11. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Sergey108, а так ты хочешь это расширением для php разработать? Не путай два разных языка.
    Я тебе говорю как будет более оптимально решить задачу, нежели писать велосипед.
     
  12. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    @rodent90, я хочу это сделать частью языка. Нужно лишь составить грамотное RFC и отдать на голосование.
    Ни о каких велосипедах речи не идет. Тут обсуждаются структуры, как часть языка.
     
  13. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Нет в php struct - типа значений (только если вмешиваться через zval* или же писать свое расширение).
    Есть трейты и классы. Которыми как-раз без труда можно решить эту задачу.
     
  14. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    @rodent90, ты не в курсе, что можно делать RFC? https://wiki.php.net/rfc/howto
    Откуда по твоему все эти модные плюшки типо тайп хинтов, генераторов итд? Неужели разработчикам вздумалось и они никого не спросив это сделали?
    НЕТ! На каждую фичу был оформлен RFC. Вот и я хочу сделать RFC, что бы в будущем увидеть структуры (в 7.2 хотелось бы, на 7.1 уже опоздали).
     
  15. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    А распиши, чем, по твоему мнению, структура отличается от класса?
     
  16. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    Структуры не наследуются (да, да, final class скажете вы, и я соглашусь), хранятся в стеке (передаются по значению), могут быть объявлены локально (прямо в функции или методе).
    Было бы здорово, если можно было бы объявить структуру на уровне класса, как и разрешить структурам реализовывать интерфейсы, как в C#.
    Короче, нет предела мечтаниям.
     
  17. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Sergey108, ты либо заблудился, либо не понимаешь о чем пишешь.
    Давай рассмотрим поведение переменных в php:
    PHP:
    1. $a = "a";
    А на самом деле это:
    Код (Text):
    1. a: {
    2.     type: string,
    3.     value:
    4.         str:
    5.             val: "a"
    6.             len: 1
    7.     is_ref: 0
    8.     refcount: 1
    9. }
    Принцип построения:
    Код (Text):
    1. struct zval {
    2.     zvalue_value value;
    3.     zend_uchar type;
    4.     zend_uchar is_ref;
    5.     zend_ushort refcount;
    6. };
    Так вот об этом дано выше, как примерно можно сделать такое детище, но гемороя ты выхватишь довольно много, да и это того стоить не будет, когда проще юзнуть класс и сделать динамику для строения структур, а не только одной конкретно.
    Тоже самое тебя ждет и в построении Enum, если вдруг взбредет делать это на php, могу посоветовать сделать дефайном через константы и можно попробовать еще завязаться на пространствах имен.
     
  18. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    @rodent90, я тебя не понимаю. Тема не о внутренностях PHP, внутренности меня не интересуют, оставим их разрабам.
    Я хочу услышать мнение людей по поводу структур, как самостоятельной конструкции (на ровне с классами, трейтами, интерфейсами).
    И ищу единомышленников, которые помогут составить RFC. А там уже видно будет, примут - так будут структуры, не примут - ну значит действительно не нужны они.
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Практическая польза именно в контексте назначения пхп от них какая?
     
  20. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Ну вот final и clone решают основные отличия. Локальность можно решить неймспейсами, хотя (мое мнение) локальность структур - редкоиспользуемый вариант. Интерфейсы есть.
    В общем неудобство одно - делать clone... что-то мне не кажется, что ради одного такого стоит городить отельные синтаксические конструкции для структур ;)
     
  21. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    Давай покажу на примере.
    PHP:
    1. <?php
    2.  
    3. class File
    4. {
    5.     /** @var File::Meta */
    6.     private $meta;
    7.  
    8.     public struct Meta
    9.     {
    10.         public function __construct(array $meta)
    11.         {
    12.             $this->stream_type = $meta['stream_type'];
    13.             $this->wrapper_type = $meta['wrapper_type'];
    14.             $this->uri = $meta['uri'];
    15.             // ...
    16.         }
    17.         public $stram_type;
    18.         public $wrapper_type;
    19.         public $uri;
    20.         // ...
    21.     }
    22.  
    23.     public function __construct(string $filename)
    24.     {
    25.         $handler = fopen($filename, 'r+');
    26.         $meta = stream_get_meta_data($handler);
    27.      
    28.         $this->meta = new Meta($meta);
    29.     }
    30.  
    31.     public function getMeta(): Meta
    32.     {
    33.         return $this->meta;
    34.     }
    35. }
    36.  
    37. // без конструктора
    38.  
    39. class File
    40. {
    41.     /** @var File::Meta */
    42.     private $meta;
    43.  
    44.     public struct Meta
    45.     {
    46.         public $stram_type;
    47.         public $wrapper_type;
    48.         public $uri;
    49.         // ...
    50.     }
    51.  
    52.     public function __construct(string $filename)
    53.     {
    54.         $handler = fopen($filename, 'r+');
    55.         $meta = stream_get_meta_data($handler);
    56.      
    57.         $this->meta = new Meta {
    58.             $meta['stream_type'],
    59.             $meta['wrapper_type'],
    60.             $meta['uri']
    61.         };
    62.     }
    63.  
    64.     public function getMeta(): Meta
    65.     {
    66.         return $this->meta;
    67.     }
    68. }
    получаем еще 1 инструмент для структурирования кода. Хотя с таким успехом лучше предложить внутренние классы.
    Чето я сам засомневался в полезности структур. Надо еще раз хорошенько подумать.
     
    #21 Sergey108, 9 авг 2016
    Последнее редактирование: 9 авг 2016
  22. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    namespace File;
    class Meta {
    }
    Мне кажется вполне вариант.
     
  23. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    Чутка поразмыслил. Все таки со структурами (уровня класса) удобно.

    Если использовать класс как структуру, то чаще всего класс будет содержать только кучку публичных свойств. Класс все же ООПшная штука.

    Преимущества структур:
    1. Удобный способ упаковать несколько значений.
    2. Структуры передаются по значению. Что гарантирует, что данные типа значения будут скопированы при передаче структуры.
    3. Структура может быть как составная часть класса. А с приватной областью видимости доступна только классу.

    Но если впилить в язык вложенные классы, то по сути, необходимость структур пропадает. Единственное, класс это ссылочный тип.

    @MiksIr, куча файликов с классами, в которых всего несколько свойств, как то не очень. Структуры удобней.
    Но настоящее удобство структур это возможность объявления в классе, с модификаторами доступа.
    --- Добавлено ---
    Вот что-что но пользы было бы больше чем от анонимных классов. Для чего они их вообще ввели!?
     
  24. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  25. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    ООП никак не исключает наличия существования DTO, о которых тут, в общем, и идет речь.
    Решается, на самом деле, так, как это решено в DTO. Т.е. immutable. К сожалению, этого нет в пхп, но эмулируется магией + гетеры/сетеры.
    И в общем immutable - это правильный путь со многих точек зрения.
    Мне кажется, вы уже пытаетесь какие-то абстрактные случаи выдумать. Структура внутри класса? Мне кажется такой класс хороший кандидат на код ревью на предмет нарушения SRP :)