Форум: "Прочее";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];
Внизструктурные типы в PHP Найти похожие ветки
← →
dmk © (2009-04-09 06:27) [0]Привет! Возникла необходимость сделать сайт и встал выбор – на чем писать? После моих исследований популярности был выбран PHP. Однако, написав определенное кол-во кода столкнулся с проблемой –
отсутствие структурных типов. Я не великий знаток PHP, да и на эту тему погуглить не дало результатов. На некоторых форумах обсуждалась эта тема, но она сводилась к использованию ассоциативных массивов, с чем мирится не хочется. В итоге решил сделать обертку и объявлять строковые переменные вроде этой: $record = "i10i2i8s40", где i - integer s - string, а цифра после – размер переменной. Добавил небольшой парсер, который эти строчки расшифровывает и формирует уже "типизированную" строку-массив нужного размера с бинарными данными, которая уже пишется в файл. Сделано это с целью убрать громоздкость php-кода, повысить скорость выполнения скрипта, избавиться от излишней обработки строк и массивов, а также не сильно изменять Pascal со своей строгой типизацией (стало привычкой). Результат - работает.
Отсюда 2 вопроса:
1. Допустимы ли такие извращения или есть пути попроще?
2. Есть ли структурные типы в других подобных PHP языках и стоит ли на них перейти во избежание таких извращений?
← →
SPeller © (2009-04-09 07:35) [1]serialize/unserialize?
← →
dmk © (2009-04-09 08:04) [2]Спасибо, но эти функции не помогают. По крайней мере со строками.
Они не выравниваются до нужной длины, а пустое место не дополняется нулями. С float вообще чудеса получаются:
echo serialize(3.141592);
Выводит -> d:3.14159200000000016217427400988526642322540283203125;
← →
palva © (2009-04-09 08:22) [3]Скажу сразу, замысел по его описанию не понял.
1. Допустимо, если вы работаете один, ваш код никто не будет читать и вы сами не собираетесь пользоваться другим кодом. На производительности ведь это не сказалось? (в чем, кстати, сомневаюсь), тогда смело пишите, как вам удобно.
2. В PHP5 переделаны возможности объектов. Есть язык Python, который, говорят, более академично выстроен. На нем не только программируют сайты, но и используют его для преподавания (на Западе). Но я не большой знаток питона.
← →
clickmaker © (2009-04-09 08:47) [4]> эти функции не помогают. По крайней мере со строками.
а с классами?
← →
antonn © (2009-04-09 09:04) [5]
> В итоге решил сделать обертку и объявлять строковые переменные
> вроде этой: $record = "i10i2i8s40", где i - integer s -
> string, а цифра после – размер переменной.
именно это и делает serialize, причем сразу для массива можно, а не для отдельного рекорда.
и вопрос - зачем оно надо?
← →
dmk © (2009-04-09 09:56) [6]>а с классами?
С классами еще не разобрался.
Интересно, а если можно класс засериализить,
то это получается по аналогии хранимых процедур можно организовать
хранение класса?
>Скажу сразу, замысел по его описанию не понял.
Предположим есть тип Record в паскале.
Type Rec = record
value1: integer; //4 байта
value2: dword; //4 байта
value3: string[40]; //40 байт
end;
Общая длина 48 байт
Мое описание того же типа:
$Rec = "i4i4s40"; //Тоже описывает 48 байт
Вот и весь замысел.
>именно это и делает serialize
В общем да. Проверил почти также выглядит, но получается некоторое неструктурированное "месево":
Serialize -> i:5;i:50;s:8:"Explorer";d:3.140000000000000124344978758017532527446746826171875;
Unserialize - > 5, 50, Explorer, 3.14
>и вопрос - зачем оно надо?
Чтобы BlockRead и BlockWrite как в Паскале был ;-)
А массив после Serialize может быть переменной длины, а это недопустимо!
Нужна переносимость данных. Чтобы потом на локальной машине
можно было доступ к данным получить через другую программу,
например, написанную на Delphi.
Спасибо за помощь!
← →
clickmaker © (2009-04-09 11:12) [7]> Нужна переносимость данных
тогда xml
или fwrite()
← →
dmk © (2009-04-09 11:25) [8]>или fwrite()
Ну я так и сделал. На входе в парсер(array[data], моя строка типизации),
а на выходе бинарная строка строго определенной длины, которую пишу в файл fwrite.
← →
antonn © (2009-04-10 00:15) [9]еще есть pack()
← →
dmk © (2009-04-10 04:59) [10]antonn © (10.04.09 00:15) [9]
Спасибо огромное. Кто ж знал. что уже реализовано ;-)
← →
palva © (2009-04-10 08:57) [11]
> Кто ж знал. что уже реализовано ;-)
Подождите, вы же написали "добавил небольшой парсер...", т. е. вы это уже реализовали. И как теперь оказалось сделали это без функции pack.
В то же время
> Сделано это с целью убрать громоздкость php-кода, повысить скорость
> выполнения скрипта, избавиться от излишней обработки строк и массивов, а
> также не сильно изменять Pascal со своей строгой типизацией (стало
> привычкой). Результат - работает.
Как же вы этого добились, да еще без функции pack? Неужели писали php extention на си?
← →
dmk © (2009-04-10 10:47) [12]>Подождите, вы же написали "добавил небольшой парсер...", т. е. вы это
>уже реализовали. И как теперь оказалось сделали это без функции pack.
Да, сначала сделал по своему. Но я не знал про функцию Pack.
В PHP более 3000 функций. Я не могу их все знать.
Тем более пишу на PHP только 2 недели.
>Как же вы этого добились, да еще без функции pack?
>Неужели писали php extention на си?
У меня было нагромождено куча лишнего кода по выравниванию строк
до нужной границы, потом для убирания лишних пробелов при выводе и
форматированию строк перед записью. Поэтому после того как я сделал
своим методом - мне показалось, что я что-то сделал нужное, т.к. код сократился раза в 3. Ну а теперь с функцией Pack он еще почти в 2 раза сократился.
И вы скажете, что сокращение кода никак не ускорило процесс?
← →
palva © (2009-04-10 12:08) [13]
> И вы скажете, что сокращение кода никак не ускорило процесс?
Процесс написания кода? Вы, кажется, писали о скорости выполнения скрипта.
Вообще, три вещи: размер кода, скорость его написания, скорость его выполнения - связаны довольно слабо.
Если вернуться к первому посту. Вам не понравилась работа с массивами и вы решили представить массив (структуру) в виде строки. Но не для передачи ее по каналам связи и не для записи в файл, а просто для того, чтобы работать с этой строкой в памяти. То есть, если вам понадобилось модифицировать третье поле - вы обращаетесь сначала к описанию этой строки, где перечислены поля, вычисляете смещение, извлекаете поле из строки с данными, модифицируете и кладете обратно. Уверяю вас, это будет медленнее, чем если бы вы тупо использовали массив. Даже если вы будете использовать pack/unpack. Преимущество будет единственное, - это похоже на делфи. Но это очень сомнительное преимущество. Его возможно, оценят те, кто кроме делфи ничего не знает и знать не хочет. Но те, кто пишут на PHP (а таких гораздо больше) подумают о вас нехорошее.
Так что лучше рассматривать ваш код, как хорошее упражнение для осваивания PHP. Даром ваш труд, конечно, не пропал.
← →
dmk © (2009-04-10 14:06) [14]>Процесс написания кода?
>Вы, кажется, писали о скорости выполнения скрипта.
Именно о скорости выполнения скрипта. В учебнике по PHP написано - чем короче код, тем быстрее он выполняется. Это же не компилятор, а интерпретатор. Хотя визуально увеличение скорости не чувствуется.
>Так что лучше рассматривать ваш код, как хорошее упражнение
>для осваивания PHP. Даром ваш труд, конечно, не пропал.
Вот именно! Это нормальный процесс обучения :-D ну вляпался первый раз.
Думаю еще не раз вляпаюсь.
← →
antonn © (2009-04-10 14:47) [15]
> Процесс написания кода? Вы, кажется, писали о скорости выполнения скрипта.
ну пхп не такой уж тормозной, как его описывают, нет большой разницы в контексте веба, выполнится ли код за 0,01 секунду или за 0,0001.
← →
antonn © (2009-04-10 15:34) [16]
> Преимущество будет единственное, - это похоже на делфи.
ах да, дело может быть даже не в похожести реализации, а в похожести на процесс, например достать теги из IDv3 или прочесть структуру файлов в zip, там тоже "рекорды" хочется прочесть :) сам сидел как то и юнит с дельфи о чтении инфо в wav почти дословно переводил на php
← →
dmk © (2009-04-10 15:41) [17]>дословно переводил на php
Вот и я про то же. Приходится совмещать.
Только у меня приходится совмещать Javascript + PHP + Delphi.
Кстати нашел прикольную обработку PHP. PHP написанный на javascript ;-)
Пишешь как на PHP, но все include прописаны в Javascript.
http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_abs/
← →
dmk © (2009-04-10 15:44) [18]Вот ведь людям не лень ;-)
← →
antonn © (2009-04-10 15:51) [19]
> Кстати нашел прикольную обработку PHP. PHP написанный на
> javascript ;-)
> Пишешь как на PHP, но все include прописаны в Javascript.
>
инклуд - это подключение скрипта :) инклуда на яве-шкрипт не может быть, она клиентская, может там просто вызовы функций через свою прокладку идут, но тогда уж обычного аякса хватит.
насчет лени - это реальная тренировка, способ постичь новое хоть с какой то реальной целью, имхо это нормально :) на phpclasses вообще туча скриптов, которые делают пару вызовов функций обернутых в свою функцию, вот уж где не лень людям :)
← →
Petr V. Abramov © (2009-04-11 14:26) [20]
> Именно о скорости выполнения скрипта. В учебнике по PHP
> написано - чем короче код, тем быстрее он выполняется.
код sleep(84600) очень короткий, но выполняется очень долго
:)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c