|
|
|
|
|
для: newProgrammer
(18.02.2009 в 19:51)
| | Как и обещал, после прочтения книжек и статей по ООП, решил заново сесть за написание своих классов, вернее, одного класса - "item". Я понял, что он у меня главный, т.к. все операции с БД и сайт в цлом связвны именно с этим классом. Класс "item" у меня абстрактный, потому, что это м.б. что угодно: от недвижимого имущества (как в моем случае) до обыкновенной статьи. Для начала, интерфейс класса, чтоб было понятно:
<?php
interface intItem {
public function append_to($table);
public function get_from($table, $field, $orderby, $dir, $limit);
public function remove_from($table);
public function modify_in($table, $sets);
public function array_to_string($array);
}
?>
|
А вот и сам класс:
<?php
abstract class absItem implements intItem {
public $prop;
/*
В качестве параметра принимает как массив так и строку. Строка может быть удобной в методах данного класса.
*/
public function __construct($arg) {
if (is_array($arg) && !empty($arg)) {
foreach ($arg as $key => $val) {
$this->prop[$key] = $val;
}
} elseif (is_string($arg)) {
$this->prop = $arg;
}
}
public function append_to($table) {
foreach ($this->prop as $field => $value) {
$fields .= "`". $field."`, ";
$values .= "'". $value."', ";
}
$fields = substr($fields,0,-2);
$values = substr($values,0,-2);
$query .= "INSERT INTO `".$table."` (".$fields.") VALUES (".$values.")";
print($query);
}
public function get_from($table, $field, $orderby, $dir, $limit) {
$where = $this->prop;
$where = $this->array_to_string($where);
//...
//...
}
public function remove_from($table) {
$where = $this->prop;
if (is_array($where) && !empty($where)) {
$query = "DELETE FROM `{$table}` WHERE 1='1'";
$query .= $this->array_to_string($where);
} elseif (is_string($where)) {
$query = "DELETE FROM `{$table}` WHERE {$where}";
}
print($query);
}
public function modify_in($table, $sets) {
$where = $this->prop;
if (is_array($where) && !empty($where)) {
foreach ($sets as $field => $value) {
$set .= "`".$field."` = '".$value."', ";
}
$set = substr($set,0,-2);
$query = "UPDATE `{$table}` SET {$set} WHERE 1='1'";
$query .= $this->array_to_string($where);
} elseif (is_string($where)) {
$query = "UPDATE `{$table}` SET `{$key}` = '{$val}' WHERE {$where}";
}
print($query);
}
public function array_to_string($array) {
foreach ($array as $key => $val) {
if (strstr($key, "_") == "_min" && substr($key, -4, 4) == "_min") {
$where .= " AND `" . substr($key, 0, strlen($key)-4) . "` >= '" . intval($val)."'";
} elseif (strstr($key, "_") == "_max" && substr($key,-4,4) == "_max") {
$where .= " AND `" . substr($key, 0, strlen($key)-4) . "` <= '" . intval($val)."'";
} else {
$where .= " AND `$key` = '$val'";
}
}
return $where;
}
}
?>
|
Пользоваться этим так:
<?php
class item extends absItem { }
$c = new item(array('type' => 'house', 'price' => '100', 'area' => '50'));
$c->append_to('table_name');
print("<br /><br />");
$c->remove_from('table_name');
print("<br /><br />");
$c->modify_in('table_name', array('type' => 'villa', 'price' => '200'));
?>
|
Класс почти готов, только пока ничего не делает, а просто выводит строку запроса, чтобы посмотреть как все рабоает. Метод "get_from()" совсем не готов, т.к. я пока думаю как лучше его реализовать. Метод "array_to_string()" тоже желательно бы переделать с тем, чтобы сделать его более универсальным.
В общем, если будут у кого-нибудь замечания или советы, буду весьма благодарен, т.к. это для меня очень важно... | |
|
|
|
|
|
|
|
для: Axxil
(16.02.2009 в 09:31)
| | 1. Скажите, пожалуйста, а почему Вы считаете, что под каждый новый запрос надо писать новый класс item? Я так и не понял...
2. Вы пишете, что логичнее будет задать только одно свойство для класса ($this->array = $array_from_db). Не знаю,чем Вы это обосновываете, но в и-нете во всех статьях об ООП учат сразу задавать все свойста, которую напрямую относятся к классу. Например, если это класс "page", о сразу задать такие свойства как "url", "title" и т.д.:
<?php
class page {
public $url;
public $title;
}
?>
| , а если написать "public $array;", то не совсем понятно что представляет из себя класс. Или я Вас не правильно понял или не понял как правильно создавать классы...
Буду благодарен если проясните. | |
|
|
|
|
|
|
|
для: DEM
(15.02.2009 в 23:48)
| | Нет, если человек написал для того, чтобы научится писать правильный, удобный, рабочий код, то я только за. Да и критику нужно принимать от двух полюсов. На то это и форум по РНР ;) | |
|
|
|
|
|
|
|
для: Loki
(18.02.2009 в 15:50)
| | На такие запросы этот класс не расчитан... Наверное проще и универсальнее написать класс, где запросы бы писались самим разработчиком, а не генерировались методами класса.
PS Все равно я пока не сдаюсь. Чувствую надо еще немного почитать про ООП. Как напишу что-нибудь по-лучше выложу сюда на всеобщее обозрение. | |
|
|
|
|
|
|
|
для: newProgrammer
(15.02.2009 в 20:22)
| | Что-то я не понял как эта штука работает.
Как, например будет выглядеть запрос типа такого:
SELECT t1.field1, t2.field2 FROM table1 t1 LEFT JOIN table2 t2 ON t1.field3=t2.field3 WHERE t1.price_min BETWEEN 100 AND 200 LIMIT 10
|
| |
|
|
|
|
|
|
|
для: STEVER
(17.02.2009 в 20:17)
| | >крайности
В крайности впадать действительно не стоит, однако, политику создания собственного программного обеспечения проводить можно и нужно. Конкуренция ещё никому не помешала, да и уровень разработчика при создании собственного приложения повышается гораздо быстрее и эффективнее, чем при использовании чужих. | |
|
|
|
|
|
|
|
для: DEM
(15.02.2009 в 23:48)
| | DEM,
тут главное не впадать в две крайности:
- отрицать все готовое
- писать все свое
Писать все свое: это ты сначала напишешь на напишешь на асме Сишку, потом на Сишке сделаешь Пхп, ну а потом уже .... Да, и про ОС не забудь, ее бы тоже неплохо запедалить ;) | |
|
|
|
|
|
|
|
для: newProgrammer
(15.02.2009 в 20:22)
| | Главное преимущество классов - повторное использование кода. В вашем случае под каждый новый запрос надо писать новый класс item
Вот это вот вообще жесть:
$this->id = $array_from_db['id'];
$this->thumb = $array_from_db['thumb'];
$this->type = $array_from_db['type'];
$this->country = $array_from_db['country'];
$this->region = $array_from_db['region'];
$this->price = $array_from_db['price'];
$this->area = $array_from_db['area'];
$this->rooms = $array_from_db['rooms'];
|
Гораздо логичнее тогда уж написать $this->array = $array_from_db и дальше внутри класса использовать массив.
В чём смысл назначения каждому элементу массива своего отдельного свойства?
PS Первым делом, проектируя классы нужно задавать вопрос в чём смысл и в чём выгода. Если их нет, то надо искать другой путь. | |
|
|
|
|
|
|
|
для: DEM
(15.02.2009 в 23:48)
| | Спасибо за положительный отзыв - отличная мотивация для начинающего вроде меня. С таким настроем никакая критика нестрашна. :)
Таких фобий как у Вас у меня нет, просто есть необходимость освоить ООП.
PS Тоже всегда старался писать свой код, а уж если и использую чужой, то сначало досконально его изучу, а потом уже и применяю. Не могу пользоваться кодом, в котором не знаю как все работатет.
PPS Жду, как говорится, конструктивной критики! | |
|
|
|
|
|
|
|
для: mihdan
(15.02.2009 в 23:38)
| | Я не хочу быть велосипедистом и ездить на велосипеде, сделанном кем-то. Я хочу уметь их делать сам. Поэтому учусь, что называется, методом проб и ошибок. Хотя, я не против того, чтоб совмещать и то и другое. Спасибо за ссылку. | |
|
|
| |
|