|
|
|
|
|
для: Trianon
(21.04.2009 в 22:01)
| | А подругому никак? Че-то не очень хочется возиться с созданием экземпляров каждый раз. | |
|
|
|
|
|
|
|
для: tAleks
(21.04.2009 в 21:30)
| | Создавать экземпляр.
Применять обычный метод. Не статический. | |
|
|
|
|
|
|
|
для: Trianon
(21.04.2009 в 19:19)
| | Я не спорю, что он что-то должен знать. Вопрос-то у меня конечный в том, как реализовать идею. | |
|
|
|
|
|
|
|
для: tAleks
(21.04.2009 в 19:03)
| | вообще-то статический метод ничег не должен знать об экземпляре объекта,
хотя бы потому, что с экземпляром не работает. | |
|
|
|
|
|
|
| Код:
<?php
abstract class c1 {
static function m1 ()
{
echo __CLASS__;
}
}
class c2 extends c1 {
}
c2::m1();
?>
|
Вызываю c2::m1(); выдает c1.
Почему?
Теперь вопрос из практики.
Хочу сделать несколько классов (статических) для работы с разными таблицами в БД. И общие методы объединить в один класс (родитель). Но возникла трудность.
Предполагалось сделать так.
Родительский класс с общими методами:
<?php
///////////////////////////////////////////////////////////////////////////
// Абстрактный Класс для работы с БД, общие методы
///////////////////////////////////////////////////////////////////////////
abstract class mydb {
// Стандартные методы: Извлечь, Добавить/Заменить, Обновить, Удалить
static function select($id, $fields = array())
{
$id = intval($id);
$fields = (!empty($fields)) ? implode(',', $fields) : '*';
$fields = mysql_escape_string($fields);
$sql = "SELECT $fields FROM ".self::$table." WHERE ".self::$key." = $id";
$query = mysql_query($sql);
return ($query && mysql_num_rows($query) == 1) ? mysql_fetch_assoc($query) : NULL;
}
static function replace($data)
{
foreach(self::$fields as $v)
if(!empty($data[$v])) $sql[] = "$v = '".mysql_escape_string($data[$v])."'";
$sql = "REPLACE ".self::$table." SET ".implode(',', $sql);
$query = mysql_query($sql);
return $query ? mysql_insert_id() : FALSE;
}
static function update($data, $id)
{
if(is_array($id))
{
foreach($id as $val) $arr_id[] = intval($val);
$id = implode(',', $arr_id);
}
else $id = intval($id);
// Формируем запрос
foreach(self::$fields as $v)
{
if(isset($data[$v]) && $data[$v] !== '') $sql[] = "$v = '".mysql_escape_string($data[$v])."'";
elseif(isset($data[$v]) && $data[$v] === '') $sql[] = "$v = DEFAULT";
}
$sql = "UPDATE ".self::$table." SET ".implode(',', $sql)." WHERE ".self::$key." IN ($id)";
$query = mysql_query($sql);
return $query ? $id : FALSE;
}
static function delete($id)
{
if(is_array($id))
{
foreach($id as $val) $arr_id[] = intval($val);
$id = implode(',', $arr_id);
}
else $id = intval($id);
$sql = "DELETE FROM ".self::$table." WHERE ".self::$key." IN ($id)";
$query = mysql_query($sql);
return $query ? mysql_affected_rows() : FALSE;
}
}
?>
|
Далее создать по классу на таблицу, примерно такие:
<?php
///////////////////////////////////////////////////////////////////////////////////////
// Класс для работы с данными ползователя
///////////////////////////////////////////////////////////////////////////////////////
class users extends mydb {
// Название таблицы
static $table = __CLASS__;
// Название ключа
static $key = 'id_user';
// Массив с полями в базе
static $fields = array(
'id_user',
'name',
'email'
);
// Далее могут быть другие, специализированные методы
}
?>
|
Птом использовать, думаю, это будет очень просто. Нужно извлечь запись:
<?php
$id_user = 1;
$user = users::select($id_user);
?>
|
По моему очень даже просто, и удобно.
Такое я уже делал, в прсшлом проекте, но там у меня были все общие методы в каждом из классов для работы с таблицами. А сейчас, я их хочу выкинуть в одтельный, и от него наследовать уже классы для работы с БД.
Но, проблема в том, что из родительского класса, не могу достучасться до свойств определенных в потомке, т.е. до свойства: static $table = __CLASS__; и др.
Как это можно преодолеть? Как можно реализовать такую идею? | |
|
|
|
|