Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Ваше мнение о моих набросках?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Сделал наброски управление текстовой базой. Уважаемые гуру помогите с изъянами, если таковые имеются
shum0531
Отправлено: 22 Января, 2013 - 16:45:53
Post Id



Гость


Покинул форум
Сообщений всего: 92
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




PHP я начал изучать относительно не давно.
В силу того что читать я не наживу, изучал практическими методами (ставил себе задачи и с подошью справки их реализовывал).
Но вот настал черед ООП и я ни как не могу его понять - как и с чем это "есть".
Попробовал написать класс работы с текстовой базой(код ниже), что то вроде получается, но смысл этого ООП когда все похоже на процедурное программирование?
Вообщем подскажите что я начал делать не так, потому что мне кажется что я пишу это "Филькина грамота"

вот собственно код:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class JsonDB {         
  3.         public $txt = '.txt';
  4.         public $confDB = '-conf.txt';
  5.         public $error = 'Не найдена таблица с данными!';       
  6.         function SELECT($fileDB) {
  7.                 if ($this->checkfile($fileDB)){
  8.                         $dd = $this->reading($fileDB.$this->txt);
  9.                         return $dd;
  10.                 } else {
  11.                         return $this->error;                   
  12.                 }
  13.         }      
  14.         function INSERT($fileDB, $param) {
  15.                 if ($this->checkfile($fileDB)){
  16.                         $data = $this->reading($fileDB.$this->txt);
  17.                         $param['id'] = ($this->ID($data))+1;
  18.                         $data[] = $param;
  19.                         $this->record($fileDB.$this->txt, $data);
  20.                 } else {
  21.                         return $this->error;                   
  22.                 }              
  23.         }      
  24.         function UPDATE($fileDB, $param) {
  25.                 if ($this->checkfile($fileDB)){
  26.                        
  27.                 } else {
  28.                         return $this->error;                   
  29.                 }
  30.                
  31.         }      
  32.         function DELETE($fileDB, $param) {
  33.                 if ($this->checkfile($fileDB)){
  34.                         $data = $this->reading($fileDB.$this->txt);
  35.                         $rec = array();
  36.                         if(isset($data)) // Костыль - когда база пустая
  37.                         foreach ($data as $k => $v) {
  38.                                 foreach ($param as $key => $value) {
  39.                                         if ($value == $data[$k][$key]){
  40.                                                 unset($data[$k]);
  41.                                         } else {
  42.                                                 $rec[] = $data[$k];
  43.                                         }
  44.                                 }
  45.                         }
  46.                         $this->record($fileDB.$this->txt, $rec);
  47.                 } else {
  48.                         return $this->error;                   
  49.                 }              
  50.         }      
  51.         function CREATE($fileDB){
  52.                 if (!$this->checkfile($fileDB)){
  53.                         fclose(fopen($fileDB.$this->txt, "a+b"));
  54.                 }
  55.         }      
  56.         function DROP($fileDB){
  57.                 if (!$this->checkfile($fileDB)){
  58.                         unlink($fileDB.$this->txt);
  59.                 } else {
  60.                         return $this->error;                   
  61.                 }
  62.         }      
  63.         private function record($fileDB, $data){
  64.                 $f = fopen($fileDB, "r+b") or die($this->error);
  65.                 flock($f, LOCK_EX);            
  66.                 ftruncate($f, 0);
  67.                 fseek($f, 0, SEEK_SET);
  68.                 //Пишем
  69.                 $data = json_encode($data);    
  70.                 fwrite($f, $data);             
  71.                 fclose($f);
  72.         }      
  73.         private function reading($fileDB){
  74.                 $f = fopen($fileDB, "r+b") or die($this->error);
  75.                 flock($f, LOCK_SH);    
  76.                 //Читаем       
  77.                 $data = file_get_contents($fileDB);                    
  78.                 return json_decode($data, true);       
  79.         }      
  80.         private function ID($DB){
  81.                 if (count($DB) > 0){
  82.                         $col = count($DB)-1;
  83.                 }else {
  84.                         return 0;
  85.                 }              
  86.                 return (int)$DB[$col]['id'];   
  87.         }      
  88.         private function checkfile($fileDB){   
  89.                 if(is_file($fileDB.$this->txt)){
  90.                         return true;   
  91.                 } else {
  92.                         return false;
  93.                 }
  94.         }      
  95. }
  96. ?>

(Добавление)
Совсем забыл.
Вот обращения к классу:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. include 'JsonDB.php';
  3. $DB = new JsonDB();
  4. // Создать таблицу 'users'
  5. $DB->CREATE('users');
  6. // Внести новые данные
  7. $DB->INSERT('users', array('имя','мыло','пароль','статус') );
  8. // Или так
  9. $DB->INSERT('users', array('user'=>'имя','mail'=>'мыло','passw'=>'пароль','rol'=>'статус') );
  10. // Удалить 'users' с id = 1
  11. $DB->DELETE('users', array('id'=>1));
  12. // Удалить таблицу 'users'
  13. $DB->DROP('users');
  14. // Извлечь все данные
  15. $DB->SELECT('users');
  16. ?>
 
 Top
spsu
Отправлено: 22 Января, 2013 - 17:12:36
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




record - там file_put_contents хватит
$fileDB - арг-ммент который почти в каждую функц. передаеться стоит сделать полем.
PHP:
скопировать код в буфер обмена
  1. $f = fopen($fileDB, "r+b") or die($this->error);

Непонятно...
Поле txt стоит переименовать в extension, там ведь не только .txt м.б?
Метод checkfile не нужен, если нужен метод который обьеенит путь к файлу с расширением то стоит его сделать но не так как в checkfile
ID можно к такому виду привести, (тернарные операторы), очень очень упращают жиизнь.

PHP:
скопировать код в буфер обмена
  1. ID(){
  2.  return 0 ? count($DB) < 0 :  (int)$DB[count($DB)-1]['id']; //Не очень читаемо но..
  3. }


DROP - метод каж-тся неправильно работает.
В случае если это метод должен удалять файл если он есть..
А он наоборот действует, если это не файл, то он удаляет его.

(Отредактировано автором: 22 Января, 2013 - 17:21:46)

 
 Top
shum0531
Отправлено: 22 Января, 2013 - 17:35:07
Post Id



Гость


Покинул форум
Сообщений всего: 92
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




spsu пишет:
record - там file_put_contents хватит


Действительно, забыл что file_put_contents имеет lock

spsu пишет:
$fileDB - арг-ммент который почти в каждую функц. передаеться стоит сделать полем.


Если честно, не совсем понимаю как. Ведь эта имя таблицы (вернее файла) если это будет свойством (полем) придется для каждой таблицы создавать объект класса.

Правильно понимаю?
 
 Top
DeepVarvar Супермодератор
Отправлено: 22 Января, 2013 - 17:58:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




shum0531 пишет:
Действительно, забыл что file_put_contents имеет lock
fflush он не имеет, а оный имеет необходимость быть для одновременной работы нескольких скриптов в контексте актуального чтения с диска. Так что оставьте как есть добавив fflush.
shum0531 пишет:
Филькина грамота
То, что указал spsu, не очень страшно. Страшнее то, что вы не удовлетворяете понятию ООП в контексте инкапсуляции. Пересмотрите смысл свойств и методов с учетом private и public.
 
 Top
spsu
Отправлено: 22 Января, 2013 - 18:00:19
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




shum0531 пишет:
spsu пишет:
record - там file_put_contents хватит


Действительно, забыл что file_put_contents имеет lock

spsu пишет:
$fileDB - арг-ммент который почти в каждую функц. передаеться стоит сделать полем.


Если честно, не совсем понимаю как. Ведь эта имя таблицы (вернее файла) если это будет свойством (полем) придется для каждой таблицы создавать объект класса.

Правильно понимаю?

PHP:
скопировать код в буфер обмена
  1. function UPDATE($fileDB, $param) {
  2.                 if ($this->checkfile($fileDB)){

Вот напрмер,.
Цитата:
придется для каждой таблицы создавать объект класса.

Нет, пользователь сможет его изменить.
Просто в класс добавте.
public $fileDB
И все пользователь укажет поле, и вызовет нужный метод.
 
 Top
DeepVarvar Супермодератор
Отправлено: 22 Января, 2013 - 18:03:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




spsu пишет:
Просто в класс добавте.
public $fileDB
И все пользователь укажет поле, и вызовет нужный метод.
Нет, я уже указал выше. Данное св-во должно быть приватным. Максимум что разрешаемо это его сеттер.
PHP:
скопировать код в буфер обмена
  1. public function setFileDB($filename) { ... }
 
 Top
spsu
Отправлено: 22 Января, 2013 - 18:06:22
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




Цитата:
Нет, я уже указал выше. Данное св-во должно быть приватным. Максимум что разрешаемо это его сеттер.

Зачем его приватным делать?
Тут от того что его поменяют нечего не случиться.
если-бы была какаето последовательность паблик методов которые вызываються,.. И между ними вклинив установку нового значение можно было бы все поламать то да а так....
Ну и правильность тут не проверяеться, тоесть сеттер будет пустой, а это лишний код(как мне кажеться).
 
 Top
DelphinPRO
Отправлено: 22 Января, 2013 - 18:07:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




shum0531 пишет:
Если честно, не совсем понимаю как. Ведь эта имя таблицы (вернее файла) если это будет свойством (полем) придется для каждой таблицы создавать объект класса.

ну давайте подумаем.
есть объект "База Данных". Этот объект может оперировать базой в целом (создать\удалить базу, создать\удалить таблицу в базе).
есть объект "Таблица". Этот объект должен уметь оперировать с данными (CRUD операции).
"База данных" должна нам предоставить объект нужной таблицы, который будет работать с данными. примерно так

PHP:
скопировать код в буфер обмена
  1. $db = new JsonDB('path/to/file.json');
  2.  
  3. $db->selectTable('users')->insert('Данные');
  4. $data = $db->selectTable('users')->select('Запрос');
  5.  
  6. или
  7.  
  8. $table = $db->selectTable('users');
  9. $table->insert('Данные');
  10. $data = $table->select('Запрос');


ООП это не функции в виде методов объекта. ООП - это мышление объектами.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 22 Января, 2013 - 18:08:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




spsu пишет:
Ну и правильность тут не проверяеться,
именно в сеттере надо проверять что нам подсовывают.
 
 Top
DelphinPRO
Отправлено: 22 Января, 2013 - 18:10:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




spsu пишет:
Зачем его приватным делать?
Тут от того что его поменяют нечего не случиться.

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

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

(Отредактировано автором: 22 Января, 2013 - 18:11:34)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
spsu
Отправлено: 22 Января, 2013 - 18:14:45
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




Цитата:
именно в сеттере надо проверять что нам подсовывают.

Выше я и написал что т.к правильность не проверяеться...
Вы же не указали что код сеттера будет не пуст и там вообще что-то будет происходить.
Если код что в первом посту брать то в сеттере нечего будет проверять, т.к в каждом методе делаеться вызов is_file.
А если его уже переработать то тогда да сеттер понадобиться ну это смотря как перерабатывать...
 
 Top
DeepVarvar Супермодератор
Отправлено: 22 Января, 2013 - 18:28:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




spsu пишет:
Выше я и написал что т.к правильность не проверяеться...
Вы же не указали что код сеттера будет не пуст и там вообще что-то будет происходить.
Если код что в первом посту брать то в сеттере нечего будет проверять, т.к в каждом методе делаеться вызов is_file.
А если его уже переработать то тогда да сеттер понадобиться ну это смотря как перерабатывать...
Вы сами и ответили на свое возражение Закатив глазки
 
 Top
shum0531
Отправлено: 22 Января, 2013 - 18:28:57
Post Id



Гость


Покинул форум
Сообщений всего: 92
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Вобьем все понятно. Спасибо огромное всем, а я пошел учить php Хм
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB