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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: ООП. Доступ к свойствам дочернего класса из метода родителя

Сообщения:  [1-5] 

 
 автор: tAleks   (21.04.2009 в 23:01)   письмо автору
 
   для: Trianon   (21.04.2009 в 22:01)
 

А подругому никак? Че-то не очень хочется возиться с созданием экземпляров каждый раз.

  Ответить  
 
 автор: Trianon   (21.04.2009 в 22:01)   письмо автору
 
   для: tAleks   (21.04.2009 в 21:30)
 

Создавать экземпляр.
Применять обычный метод. Не статический.

  Ответить  
 
 автор: tAleks   (21.04.2009 в 21:30)   письмо автору
 
   для: Trianon   (21.04.2009 в 19:19)
 

Я не спорю, что он что-то должен знать. Вопрос-то у меня конечный в том, как реализовать идею.

  Ответить  
 
 автор: Trianon   (21.04.2009 в 19:19)   письмо автору
 
   для: tAleks   (21.04.2009 в 19:03)
 

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

  Ответить  
 
 автор: 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__; и др.

Как это можно преодолеть? Как можно реализовать такую идею?

  Ответить  

Сообщения:  [1-5] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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