Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.006 c
2-1241037428
бульдозер
2009-04-30 00:37
2009.06.21
как зная ID процесса получить хендл окна этого процесса


15-1239631596
пикассо
2009-04-13 18:06
2009.06.21
delphi to builder


15-1239711326
Kolan
2009-04-14 16:15
2009.06.21
«Интерфейс пользователя» → Хорошая замена MessageBox а


2-1241507863
Zalum
2009-05-05 11:17
2009.06.21
Вызвать процедуру из другого модуля


2-1240998993
AG
2009-04-29 13:56
2009.06.21
Delphi, матрицы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский