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
Форумы портала PHP.SU :: Версия для печати :: Ваше мнение о моих набросках?
Форумы портала PHP.SU » » Вопросы новичков » Ваше мнение о моих набросках?

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

1. shum0531 - 22 Января, 2013 - 16:45:53 - перейти к сообщению
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. ?>
2. spsu - 22 Января, 2013 - 17:12:36 - перейти к сообщению
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 - метод каж-тся неправильно работает.
В случае если это метод должен удалять файл если он есть..
А он наоборот действует, если это не файл, то он удаляет его.
3. shum0531 - 22 Января, 2013 - 17:35:07 - перейти к сообщению
spsu пишет:
record - там file_put_contents хватит


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

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


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

Правильно понимаю?
4. DeepVarvar - 22 Января, 2013 - 17:58:03 - перейти к сообщению
shum0531 пишет:
Действительно, забыл что file_put_contents имеет lock
fflush он не имеет, а оный имеет необходимость быть для одновременной работы нескольких скриптов в контексте актуального чтения с диска. Так что оставьте как есть добавив fflush.
shum0531 пишет:
Филькина грамота
То, что указал spsu, не очень страшно. Страшнее то, что вы не удовлетворяете понятию ООП в контексте инкапсуляции. Пересмотрите смысл свойств и методов с учетом private и public.
5. spsu - 22 Января, 2013 - 18:00:19 - перейти к сообщению
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
И все пользователь укажет поле, и вызовет нужный метод.
6. DeepVarvar - 22 Января, 2013 - 18:03:11 - перейти к сообщению
spsu пишет:
Просто в класс добавте.
public $fileDB
И все пользователь укажет поле, и вызовет нужный метод.
Нет, я уже указал выше. Данное св-во должно быть приватным. Максимум что разрешаемо это его сеттер.
PHP:
скопировать код в буфер обмена
  1. public function setFileDB($filename) { ... }
7. spsu - 22 Января, 2013 - 18:06:22 - перейти к сообщению
Цитата:
Нет, я уже указал выше. Данное св-во должно быть приватным. Максимум что разрешаемо это его сеттер.

Зачем его приватным делать?
Тут от того что его поменяют нечего не случиться.
если-бы была какаето последовательность паблик методов которые вызываються,.. И между ними вклинив установку нового значение можно было бы все поламать то да а так....
Ну и правильность тут не проверяеться, тоесть сеттер будет пустой, а это лишний код(как мне кажеться).
8. DelphinPRO - 22 Января, 2013 - 18:07:24 - перейти к сообщению
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('Запрос');


ООП это не функции в виде методов объекта. ООП - это мышление объектами.
9. DeepVarvar - 22 Января, 2013 - 18:08:05 - перейти к сообщению
spsu пишет:
Ну и правильность тут не проверяеться,
именно в сеттере надо проверять что нам подсовывают.
10. DelphinPRO - 22 Января, 2013 - 18:10:24 - перейти к сообщению
spsu пишет:
Зачем его приватным делать?
Тут от того что его поменяют нечего не случиться.

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

можно конечно и перед каждым использованием проверять, но лучше положить одинь раз правильное значение в приватное поле и быть уверенным, что оно будет корректным при использовании.
11. spsu - 22 Января, 2013 - 18:14:45 - перейти к сообщению
Цитата:
именно в сеттере надо проверять что нам подсовывают.

Выше я и написал что т.к правильность не проверяеться...
Вы же не указали что код сеттера будет не пуст и там вообще что-то будет происходить.
Если код что в первом посту брать то в сеттере нечего будет проверять, т.к в каждом методе делаеться вызов is_file.
А если его уже переработать то тогда да сеттер понадобиться ну это смотря как перерабатывать...
12. DeepVarvar - 22 Января, 2013 - 18:28:19 - перейти к сообщению
spsu пишет:
Выше я и написал что т.к правильность не проверяеться...
Вы же не указали что код сеттера будет не пуст и там вообще что-то будет происходить.
Если код что в первом посту брать то в сеттере нечего будет проверять, т.к в каждом методе делаеться вызов is_file.
А если его уже переработать то тогда да сеттер понадобиться ну это смотря как перерабатывать...
Вы сами и ответили на свое возражение Закатив глазки
13. shum0531 - 22 Января, 2013 - 18:28:57 - перейти к сообщению
Вобьем все понятно. Спасибо огромное всем, а я пошел учить php Хм

 

Powered by ExBB FM 1.0 RC1