За последние 24 часа нас посетили 20213 программистов и 1086 роботов. Сейчас ищут 744 программиста ...

PHP и структуры

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

?

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

  1. да

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

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

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    пхпдок интерфейсы не заменяет. и тут не заменит.
     
  2. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Гарантирование типа - не является задачей структуры, это задача ЯП. Задача структуры - гарантирование полей.
    Для чего она нужна? Я вот тоже не знаю, для чего она нужна, не я хотел ее тут ;) В разных ЯП структура играет разную роль. В с++ - структура фактически синоним класса и играет скорее семантическую разницу. В с# структура тоже близко к классу, но отличий несколько больше, основное, что структура передается по значению, тогда как объект класса - по ссылке. В Java нет отдельной конструкции "структура".
     
    mr.akv нравится это.
  3. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    ты про ООПшный интерфейс? в интерфейсе не могут быть определены поля (пхпшные свойства). а доки отлично подсказывают типы, как то же уживаются люди, переменные комментируют, свойства. даже магию можно задокументировать пхпдоком.
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    странные слова. В нашем ЯП пока толком нет ни того, ни другого, и никаких гарантий ничего. Не важно, кто в этом виноват, но на текущий момент структура не сработает, как хотелось бы.

    гарантирование наличия полей, их типов, лимитов, самого типа структуры и её содержимого. Ничего этого в пхп нет. Канэц.

    И в пхп нет. Но плюшки она тащит за собой. Можно вкрячить. Насколько проблематично - вопрос второй. Если говорить о мечтах, я вот мечтаю об упрощённых трай-кетчах. А то сегодняшние - очень тяжёлые.
    --- Добавлено ---
    с такой логикой можно далеко пойти. Че ж те неймётся, как-то же уживался без структур, как когда-то без йелдов и прочей мути. Как-то же на PHP4 сайт лабали. Как-то же.
     
    mr.akv нравится это.
  5. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Все в пхп есть, что нужно динамически типизированному языку. И гарантирование структуры и проверка типа объекта.
    Структура в пхп может и была полезна кому-то в том виде, что придумано в c#, но сильного прорыва и профита в этом не вижу...
     
    mr.akv нравится это.
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    согласен. просто "структуры" как раз должны быть более лёгкой версией объекта. В случае пхп оно сильно легче не будет и можно забить.
     
    mr.akv нравится это.
  7. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Ну скажи, в каком языке структуры - "более легкая версия".
     
    mr.akv нравится это.
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    в сях? в го? в бейсике?
    --- Добавлено ---
    не, в го нету вообще такого различия. Пойду про си почитаю.
    --- Добавлено ---
    C++ разницы нет, кроме дефолтной приватности/публичности.
    --- Добавлено ---
    в C в структурах нельзя иметь методов, только данные.
    Получается, разница есть только в голом C. Больше нигде.
    --- Добавлено ---
    в бейсике плюшка от структуры есть только если она занимает в памяти не больше 16 байт.
    --- Добавлено ---
    в C# точно так же как и в бейсике, что логично.
     
    mr.akv нравится это.
  9. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    В го же нет объектов, как и в сях, какое там различие может быть? ;) Object.h в сях - это просто надстройка на структурах.
     
    mr.akv нравится это.
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    В пхп всё не так
    https://gist.github.com/Thinkscape/1136563#gistcomment-1672635

    С версии 5.какой-то объекты со свойствами жрут меньше памяти, чем массивы - раз. Два, с версии 7 они и по скорости почти не отличаются.

    Алиллуйа! Спасибо Миксеру, я жил в страхе, а теперь я счастлив!
    --- Добавлено ---
    да, вообще не катит. В голых сях нет объектов, в том-то и их соль. Смысла гуглить не было, но я почему-то загуглил и получил какие-то ответы. Стоит их проигнорировать.

    А го конечно странный в этом плане. Странный...
    --- Добавлено ---
    Но очень интересный :D
     
    mr.akv нравится это.
  11. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Я о том и говорил, что ты привыкнув к структурам в статически типизированных языках решил, что это вроде как ее характерная черта. Но нет, это характерная черта всего языка в целом. Статически типизированный - есть указание типа, динамически типизированный - нет указания типа. А структуры и объекты - фактически одно и тоже. Полагаю, что объекты в плюсах и выросли из структуры, а структуру оставили для аналонии с С.
    Хотя мне вот в голову не приходит сейчас ни один динамически типизированный язык одновременно со структурами и объектами. Хотя это ни о чем не говорит ;) Только о том, что С оказывает существенное влияние ;)
     
    mr.akv и mahmuzar нравится это.
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    прям хорошего настроения привалило. Спасиб, чувак!
     
    mr.akv нравится это.
  13. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    PHP:
    1. final class struct {
    2.  
    3.     private $_key,
    4.             $_value,
    5.             $_callback;
    6.  
    7.     public function __construct($key, $value, callable $callback) {
    8.         $this->_key = $key;
    9.         $this->_value = $value;
    10.         $this->_callback = $callback;
    11.     }
    12.  
    13.     public function __call($call, array $args) {
    14.         if(isset($this->{'_' . $call}) && ($call = $this->{'_' . $call}) && is_callable($call)) {
    15.             return call_user_func_array($call, $args);
    16.         }
    17.     }
    18.  
    19.     public function __get($key) {
    20.         if(isset($this->{'_' . $key})) {
    21.             return $this->{'_' . $key};
    22.         }
    23.     }
    24.  
    25.     public function __set($key, $value) {
    26.         return;
    27.     }
    28.  
    29. }
    PHP:
    1. $s = new struct('name', 'value', function() {
    2.     return __FUNCTION__;
    3. });
    4.  
    5. $s->key = 1; // игнор
    6. $s->value = 2; // игнор
    7. $s->calback = function() {
    8.     return'implemented';
    9. }; // игнор
    10. $s->newVar = 'new'; // игнор
    11.  
    12. echo $s->key, // name
    13. $s->value, // value
    14. $s->callback(); // {closure}
     
  14. Sergey108

    Sergey108 Новичок

    С нами с:
    15 июл 2016
    Сообщения:
    71
    Симпатии:
    1
    Магия сакс. IDE ничего не подскажет. С таким же успехом можно массив заюзать или stdClass.
     
  15. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Ну-ну и как же ты интересно инкапсулируеш массив или stdClass? И каллбеки еще введи туда ага. Ты подумал бы прежде чем писать.
     
  16. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Существует пхпдок
    Выстрел себе в ногу, если делаешь immutable, кричи об этом при попытке изменить.
     
  17. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Остается застрелиться.
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    слушайте, ну это уже крайности чтобы всё было гибко и нигде ничего не перегибалось.

    Объекты очень быстрые. Вон в ссылке, что я давал они чуток сливают массивам по скорости, и почти вдвое меньше занимают памяти. Это ж золотая эра ПХП сейчас. Пиши как хочешь, всё будет быстро и хорошо.

    Я прям восхищаюсь этим языком. Меня так прёт только Го. Но я с ним мало работал. Не работал вернее. Тыкался тока.
     
  19. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    С динамикой удобнее работать, так как за место 5 классов будет 1, который будет контролировать входящие данные и формировать соответствующую структуру, а не 5 классов которые пообщались между собой, покидались в друг-друг какашками и ровным счетом ничего толком не сделали.
    Ты хочешь сказать. что:
    Наполнение stdClass, будет меньше весить, чем наполнить $array[] ?
    Я не так давно сделал, чтобы у меня объекты сохранялись - взбрело в голову, чтобы на этапе выполнения программы, по надобности можно было делать export или import, как объектов, так и массивов, но все равно массивы работают быстрее, а вот на том, что весят больше, надо будет как-нибудь на досуге проверить на реальных данных.
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я хочу сказать ты ссылку-то смотрел мою?
     
  21. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Смотрел, но пока сам не убежусь и не протесчу на реальных данных, а не каких-то гонимых циклах в 1000 - 100000 (циферок).

    Вообщем Массивы:
    73 ms, 20.6 mib

    Объекты:
    87 ms, 20.75 mib

    Но пока я на реальных данных не проверю, хер поверю, что такое возможно. :)
     
  22. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    В поддержку. При работе с объектами есть один косяк - ссылки, по которым они передаются. Если за этим не проследить, то на больших объемах сборщик мусора перестает разбираться в этой мешанине, начинает халявничать и память течет. Это конечно же вопрос к качеству кода, но всё же дополнительная сложность.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    на память - забить болт
     
  24. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Тебе все-равно придется делать разные классы, что бы описать конструктор и интерфейс.
    У тебя есть реалный кейс? Ты нашел причину? Можно почитать открытый баг?
     
  25. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Дык это не баг ни разу. Объекты, если их не клонировать, передаются ссылками, ссылки эти могут остаться где-то в недрах того же orm от фреймворка и потекло. Сборщик это видит и соответственно удалить не может. Да и не рассчитано оно на это. Массив же штука простая, область видимости пропала - можно удалять. Я ж написал, что это вопрос к качеству кода, а не к пыху и его сборщику )
    можно. Если это не долгоживущее cli.