Гарантирование типа - не является задачей структуры, это задача ЯП. Задача структуры - гарантирование полей. Для чего она нужна? Я вот тоже не знаю, для чего она нужна, не я хотел ее тут В разных ЯП структура играет разную роль. В с++ - структура фактически синоним класса и играет скорее семантическую разницу. В с# структура тоже близко к классу, но отличий несколько больше, основное, что структура передается по значению, тогда как объект класса - по ссылке. В Java нет отдельной конструкции "структура".
ты про ООПшный интерфейс? в интерфейсе не могут быть определены поля (пхпшные свойства). а доки отлично подсказывают типы, как то же уживаются люди, переменные комментируют, свойства. даже магию можно задокументировать пхпдоком.
странные слова. В нашем ЯП пока толком нет ни того, ни другого, и никаких гарантий ничего. Не важно, кто в этом виноват, но на текущий момент структура не сработает, как хотелось бы. гарантирование наличия полей, их типов, лимитов, самого типа структуры и её содержимого. Ничего этого в пхп нет. Канэц. И в пхп нет. Но плюшки она тащит за собой. Можно вкрячить. Насколько проблематично - вопрос второй. Если говорить о мечтах, я вот мечтаю об упрощённых трай-кетчах. А то сегодняшние - очень тяжёлые. --- Добавлено --- с такой логикой можно далеко пойти. Че ж те неймётся, как-то же уживался без структур, как когда-то без йелдов и прочей мути. Как-то же на PHP4 сайт лабали. Как-то же.
Все в пхп есть, что нужно динамически типизированному языку. И гарантирование структуры и проверка типа объекта. Структура в пхп может и была полезна кому-то в том виде, что придумано в c#, но сильного прорыва и профита в этом не вижу...
согласен. просто "структуры" как раз должны быть более лёгкой версией объекта. В случае пхп оно сильно легче не будет и можно забить.
в сях? в го? в бейсике? --- Добавлено --- не, в го нету вообще такого различия. Пойду про си почитаю. --- Добавлено --- C++ разницы нет, кроме дефолтной приватности/публичности. --- Добавлено --- в C в структурах нельзя иметь методов, только данные. Получается, разница есть только в голом C. Больше нигде. --- Добавлено --- в бейсике плюшка от структуры есть только если она занимает в памяти не больше 16 байт. --- Добавлено --- в C# точно так же как и в бейсике, что логично.
В го же нет объектов, как и в сях, какое там различие может быть? Object.h в сях - это просто надстройка на структурах.
В пхп всё не так https://gist.github.com/Thinkscape/1136563#gistcomment-1672635 С версии 5.какой-то объекты со свойствами жрут меньше памяти, чем массивы - раз. Два, с версии 7 они и по скорости почти не отличаются. Алиллуйа! Спасибо Миксеру, я жил в страхе, а теперь я счастлив! --- Добавлено --- да, вообще не катит. В голых сях нет объектов, в том-то и их соль. Смысла гуглить не было, но я почему-то загуглил и получил какие-то ответы. Стоит их проигнорировать. А го конечно странный в этом плане. Странный... --- Добавлено --- Но очень интересный
Я о том и говорил, что ты привыкнув к структурам в статически типизированных языках решил, что это вроде как ее характерная черта. Но нет, это характерная черта всего языка в целом. Статически типизированный - есть указание типа, динамически типизированный - нет указания типа. А структуры и объекты - фактически одно и тоже. Полагаю, что объекты в плюсах и выросли из структуры, а структуру оставили для аналонии с С. Хотя мне вот в голову не приходит сейчас ни один динамически типизированный язык одновременно со структурами и объектами. Хотя это ни о чем не говорит Только о том, что С оказывает существенное влияние
PHP: final class struct { private $_key, $_value, $_callback; public function __construct($key, $value, callable $callback) { $this->_key = $key; $this->_value = $value; $this->_callback = $callback; } public function __call($call, array $args) { if(isset($this->{'_' . $call}) && ($call = $this->{'_' . $call}) && is_callable($call)) { return call_user_func_array($call, $args); } } public function __get($key) { if(isset($this->{'_' . $key})) { return $this->{'_' . $key}; } } public function __set($key, $value) { return; } } PHP: $s = new struct('name', 'value', function() { return __FUNCTION__; }); $s->key = 1; // игнор $s->value = 2; // игнор $s->calback = function() { return'implemented'; }; // игнор $s->newVar = 'new'; // игнор echo $s->key, // name $s->value, // value $s->callback(); // {closure}
Ну-ну и как же ты интересно инкапсулируеш массив или stdClass? И каллбеки еще введи туда ага. Ты подумал бы прежде чем писать.
слушайте, ну это уже крайности чтобы всё было гибко и нигде ничего не перегибалось. Объекты очень быстрые. Вон в ссылке, что я давал они чуток сливают массивам по скорости, и почти вдвое меньше занимают памяти. Это ж золотая эра ПХП сейчас. Пиши как хочешь, всё будет быстро и хорошо. Я прям восхищаюсь этим языком. Меня так прёт только Го. Но я с ним мало работал. Не работал вернее. Тыкался тока.
С динамикой удобнее работать, так как за место 5 классов будет 1, который будет контролировать входящие данные и формировать соответствующую структуру, а не 5 классов которые пообщались между собой, покидались в друг-друг какашками и ровным счетом ничего толком не сделали. Ты хочешь сказать. что: Наполнение stdClass, будет меньше весить, чем наполнить $array[] ? Я не так давно сделал, чтобы у меня объекты сохранялись - взбрело в голову, чтобы на этапе выполнения программы, по надобности можно было делать export или import, как объектов, так и массивов, но все равно массивы работают быстрее, а вот на том, что весят больше, надо будет как-нибудь на досуге проверить на реальных данных.
Смотрел, но пока сам не убежусь и не протесчу на реальных данных, а не каких-то гонимых циклах в 1000 - 100000 (циферок). Вообщем Массивы: 73 ms, 20.6 mib Объекты: 87 ms, 20.75 mib Но пока я на реальных данных не проверю, хер поверю, что такое возможно.
В поддержку. При работе с объектами есть один косяк - ссылки, по которым они передаются. Если за этим не проследить, то на больших объемах сборщик мусора перестает разбираться в этой мешанине, начинает халявничать и память течет. Это конечно же вопрос к качеству кода, но всё же дополнительная сложность.
Тебе все-равно придется делать разные классы, что бы описать конструктор и интерфейс. У тебя есть реалный кейс? Ты нашел причину? Можно почитать открытый баг?
Дык это не баг ни разу. Объекты, если их не клонировать, передаются ссылками, ссылки эти могут остаться где-то в недрах того же orm от фреймворка и потекло. Сборщик это видит и соответственно удалить не может. Да и не рассчитано оно на это. Массив же штука простая, область видимости пропала - можно удалять. Я ж написал, что это вопрос к качеству кода, а не к пыху и его сборщику ) можно. Если это не долгоживущее cli.