Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как прочитать строки из файла в объект
 
 автор: alba   (29.11.2008 в 12:07)   письмо автору
 
 

Всем привет!

Имеется файл users.dat следующей структуры:

Имя  Логин  email  пароль



Так же имеется скрипт, который считывает все строки файла users.dat в массив вида:

array(строка1, строка2, строка3, строка4, ..., строкаN)


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

array([[0]=>$obj1, [1]=>$obj3, [2]=>$obj3, ..., [n]=>$objN)


В принципе, я могу сделать это и сам, но у меня пока еще не всегда получается писать короткий и красивы код. Потому решил попросить помощи тут...

У меня есть одна идея, но до конца я ее не могу продумать...
предполагаю создать такой класс:

class Users {
   public $_name;
   public $_login;
   public $_email;
   public $_password;
}


и использовать его, но как именно - пока не придумал...

у кого какие идеи?

  Ответить  
 
 автор: Valick   (29.11.2008 в 12:14)   письмо автору
 
   для: alba   (29.11.2008 в 12:07)
 

Чем вас двумерный ассоциативный массив не устраивает?

  Ответить  
 
 автор: Alba   (29.11.2008 в 12:24)   письмо автору
 
   для: Valick   (29.11.2008 в 12:14)
 

да можно и двумерный массив...
тогда просто скажите как без лишних присваиваний и итераций сделать ассоциативный массив с "правильными" индексами...

но вообще я хочу сделать массив объектов.... :)

  Ответить  
 
 автор: Valick   (29.11.2008 в 13:09)   письмо автору
 
   для: Alba   (29.11.2008 в 12:24)
 

А файл большой?

  Ответить  
 
 автор: Alba   (29.11.2008 в 13:23)   письмо автору
 
   для: Valick   (29.11.2008 в 13:09)
 

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

  Ответить  
 
 автор: Valick   (29.11.2008 в 13:24)   письмо автору
 
   для: Alba   (29.11.2008 в 12:24)
 

Если маленький, то примерно так:
<?php
// Открываем файл если он существует
    
if(file_exists($file))
        {
        
$f=fopen($file"r+t") or die("Невозможно открыть файл");
// Блокируем файл (разделяемая блокировка)
        
flock($fLOCK_SH);    // ждём завершения процесса записи
// В файл теперь никто не пишет, можно читать
        
$cont=explode("\n",fread($f,filesize($file)));    // считываем файл
        
fclose($f);        // закрываем файл
// Обрабатываем массив "без лишних итераций" :)
    
foreach($cont as $key=>$value)
        {
        
res=explode(" ",$value);
        
mass[$key]['name']=res[0];
        
mass[$key]['login']=res[1];
        
mass[$key]['email']=res[2];
        
mass[$key]['password']=res[3];
        }
        }
    else
        {
        
$cont="Файл не существует";
        }
?>

  Ответить  
 
 автор: Alba   (29.11.2008 в 17:42)   письмо автору
 
   для: Valick   (29.11.2008 в 13:24)
 

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

в принципе почти все готово у меня, но возникают некоторые трудности, по поводу одной из них я создал еще одну тему... :)

  Ответить  
 
 автор: Alba   (29.11.2008 в 21:30)   письмо автору
33.6 Кб
 
   для: Alba   (29.11.2008 в 17:42)
 

все, сделал как хотелось...
в аттаче архив, оцените пожалуйста степень "кривизны рук" :)

замысел такой: пытаюсь сделать класс для работы с файлами, чтобы использовать его потом на сайтах без MySQL и т.п. Основной акцент сделан на то чтобы обеспечить сохранность файлов данных при обращении к одним и темже файлам нескольких пользователей...
Принцип действия такой: когда скрипт обращается к какому-нибудь файлу 'somefile.ext', то в некоторой временной папке создается пустой файл 'somefile.ext.tmp' и пока он существует, к файлу родителю 'somefile.ext' нельзя обратиться... как только скрипт закончил работу с файлом 'somefile.ext', его временная копия 'somefile.ext.tmp' удаляется и скрипты снова могут работать с файлом 'somefile.ext'...

:) надеюсь не запутал никого...

но мне сейчас интересно Ваше мнение о том как я реализовал функцию objFileArray('filename', 'classname').
эта функция считывает файл filename и каждую строку этого файла преобразует в объект класса classname и возвращает массив объектов данного класса...

кто что скажет по этому поводу? может это можно сделать как-нибудь побыстрее, поинтереснее...

  Ответить  
 
 автор: Valick   (29.11.2008 в 21:39)   письмо автору
 
   для: Alba   (29.11.2008 в 21:30)
 

Основной акцент сделан на то чтобы обеспечить сохранность файлов данных при обращении к одним и темже файлам нескольких пользователей...

для этого придумали блокировку файлов.

  Ответить  
 
 автор: Alba   (29.11.2008 в 21:45)   письмо автору
 
   для: Valick   (29.11.2008 в 21:39)
 

это я знаю... просто при определенных обстоятельствах она не спасает...

  Ответить  
 
 автор: Valick   (29.11.2008 в 21:52)   письмо автору
 
   для: Alba   (29.11.2008 в 21:45)
 

это каких же обстоятельствах?
кстати у вас никаких блокировок нет...

  Ответить  
 
 автор: Alba   (29.11.2008 в 21:56)   письмо автору
 
   для: Valick   (29.11.2008 в 21:52)
 

не то хотел сказать.... просто помоему flock слишком замороченная функция...
мне кажется так как сделал я - проще, тем более что это не моя личная идея...
http://omsk777.ru/all.php?act=block

а вообще мне было бы инетеснее услышать что-либо по поводу ф-ии objFileArray

вот еще по flock http://omsk777.ru/all.php?act=flock

  Ответить  
 
 автор: Valick   (29.11.2008 в 22:23)   письмо автору
 
   для: Alba   (29.11.2008 в 21:56)
 

глупости... авторам этой писанины не мешало-бы мат часть поучить (и вам тоже) и правильно применять блокировку. выкинуть из кода все @ и уж точно не использовать
("file_base.dat", "w")

а вообще мне было бы инетеснее услышать что-либо по поводу ф-ии objFileArray
а что вы хотите услышать?
вы обернули стандартные функции работы с файлами в какие-то классы и всё.
я так и не понял каким образом увас происходит блокировка?

  Ответить  
 
 автор: Alba   (30.11.2008 в 08:27)   письмо автору
 
   для: Valick   (29.11.2008 в 22:23)
 

> и уж точно не использовать ("file_base.dat", "w")
а здесь что не так?

>а что вы хотите услышать?
услышать бы хотелось мнение по поводу "оптимальности" реализации разбора файла... может есть более быстрые способы?

>я так и не понял каким образом увас происходит блокировка?
по сути как таковой блокировки файла не происходит... просто при открытии файла функцией OpenFile делается проверка на существование временной копии открываемого файла... если копия существует, значит файл "занят" и функция ожидает пока он не освободится.... как только файл освободился, его копия удаляется (ф-я CloseFile) и ожидающий скрипт приступает к обработке освободившегося файла по той же схеме... т.е. создает временную копию файла - признак того что файл занят, затем обрабатывает файл, и как только закончил обработку удаляет временную копию файла, тем самым сообщая всем что файл свободен...

ps: я два года не занимался php, сейчас решил начать изучение php5 практически с нуля, поэтому глупостей со своей стороны избежать не могу... звеняйте...

  Ответить  
 
 автор: Valick   (30.11.2008 в 11:15)   письмо автору
 
   для: Alba   (30.11.2008 в 08:27)
 

а здесь что не так?
а то что между открытием файла fopen и блокировкой файла, есть промежуток времени в который может вклиниться другой процесс. ("file_base.dat", "w") по сути изменяет (очищает) файл, чего категорически нельзя делать до его блокировки. Вообще проще отказаться от w и w+, потому как его грамотное применение требуется крайне редко. Надёжнее очищать файл вручную уже после блокировки файла.
При работе с блокировкой есть подводные камни, но все они уже давно известны и описаны (например у Д.Котерова "РНР5"). Просто нужно использовать нужную блокировку в нужное время.

  Ответить  
 
 автор: Николай2357   (29.11.2008 в 22:54)   письмо автору
 
   для: Alba   (29.11.2008 в 21:56)
 

Как то в незапамятные времена, начитавшись подобного рода трактатов, пестрящие выражениями плана которую кладем в переменную , я испытал жуткий конфуз, когда сайт "залег" прямо во время демонстрации. Вообще с тех пор я пользуюсь функцией file_put_cоntents() Не знаю, на сколько это панацея, но у меня (тьфу, тьфу) пока проблем не возникало...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования