Обращение из одного класса к другому

Тема в разделе "PHP", создана пользователем Raccoon, 4 июл 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Raccoon

    Raccoon

    Регистр.:
    31 июл 2007
    Сообщения:
    172
    Симпатии:
    9
    Добрый день!

    Возник вопрос.

    есть класс mysql database и есть ещё допустим один класс:

    require_once('database.class.php');
    require_once('misc.class.php');

    $db = new Database();

    когда я в классе misc.class.php пишу функцию, которая обращается к базе данных:

    public function check_anything () {
    $db->query($q);
    }

    почему то до класса mysql я не достукиваюсь:

    Fatal error: Call to a member function query() on a non-object

    Как можно получить доступ к методам соседнего класса?
     
  2. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    при создании класса misc.class.php нужно указать наследование класса 'Database'
    class Misc extends Database {
    }

    и далее обращаться к методам через $this
    $this->query($q);
     
  3. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    за областью действия переменных следить не забываем:

    PHP:
    public function check_anything () {

    global 
    $db// чтобы можно было обратиться к глобальной переменной, ее надо объявить внутри функции здесь.

    $db->query($q);
    }
     
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    database.class.php
    PHP:
    class Database {
     
     public function 
    query($x){

       
    // *****
     
    }
    }
    misc.class.php
    PHP:
    class Misc {
      private 
    $db;
      
      public function 
    __construct(){
         
        
    $this->db = new Database();
      }

      public function 
    check_anything () {
         
    $this->db->query($q);
      }
     

    }
    как-то так ...

    получается что при создании класса Misc вызовититься конструктор __construct и там уже создастся экземпляр класса Database

    и потом внутри класса Misc к экземпляру класса базы нужно будет обращаться уже через $this->db

    а то что написал diavolic - не слушай его ... - это он пошутил так
     
  5. Xel'[Naga]

    Xel'[Naga] Писатель

    Регистр.:
    23 мар 2007
    Сообщения:
    9
    Симпатии:
    0
    А если нужно создать 100 экземляров Misc? В твоём случае нужно создать 100 подключений к базе, получается так? А если по среди работы нужно вообще подключиться к другой бд, что тогда?
     
  6. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    в примере что выше - да, будет 100 подключений ....

    но обычно клас БД проектируют как Singleton, который лишен данного недостатка
    http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)
    тогда класс делают по принцыпу "multi-Singleton-а" ... в классе хранят массив с подключениями и по какому-то запросу возвращают нужно подключение
     
  7. Xel'[Naga]

    Xel'[Naga] Писатель

    Регистр.:
    23 мар 2007
    Сообщения:
    9
    Симпатии:
    0
    Обычно класс проектируют так, чтобы он выполнял исключительно свои задачи.

    Вообще-то всё куда проще, в класс просто отправляют запрос ну и название базы(примерно)/соединения в зависимости от того, как написан код, а уж сам класс сам соображает как ему работать с коннектами.

    Поэтому логичней создать экземпляр класса для работы с бд, а потом из другого класса получить к нему доступ:
    PHP:
    <?php
    require('primaryMisc.class.php');
    require(
    'mysql.class.php');
    $db = new MySQL('root''pass''db');

    class 
    Misc extends PrimaryMisc{
     public function 
    test(){
      global 
    $db;
      
      
    $result $db->query("select * from `db`");
     }
    }
    ?>
    Тебе так не кажется?
     
  8. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    ну оно так и будет

    в ООП классах такого быть не должно, это противоречит принципам ООП и является гамнокодингом
     
  9. Xel'[Naga]

    Xel'[Naga] Писатель

    Регистр.:
    23 мар 2007
    Сообщения:
    9
    Симпатии:
    0
    Там такого не просто быть не должно, там такого быть просто не может. Но это не касается пхп, т.к. в пхп отсутствует родительский класс. Если уж тебе совсем не терпится, можно передать ссылку на экземпляр в класс, но иногда это создаёт столько проблем, что пц....
     
  10. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    чет я вовсе запутался и не понимаю о чем вы говорите ...
    вы явно сами себе противоречите .... сейчас вы говорите что таково быть не может, но постом ранее это же сами использовали...




    как это в пхп отсутствует родительский класс?

    вот пример, класс ChildClass наследуется от класса ParentClass
    - следовательно класс ParentClass является родительским классом для класса ChildClass
    PHP:
    class ParentClass
    }

    class 
    ChildClass extends  ParentClass{
    }
    думаю вам следует чуть глубже изучит ООП в целом, и в пхп в частности
    неплохо начать со следующих статей
    http://php.su/learnphp/phpoo/?basic
    http://php.su/learnphp/phpoo/?php5

    в пхп5 любой экземпляр класса передается по ссылке...


    преимущество использования класса базы данных спроектированного по шаблону Singleton именно в том что он гарантирует наличие лишь одного экземпляра класса
    и просто физически нельзя создать их больше, это будет контролироваться самим ПХП
    ( при условии что разработчик не напишет другой класс для работы с БД и не начнет его использовать, или же не будет работать с БД посредством функций )

    в вашем же случае
    PHP:
    $db = new MySQL('root''pass''db');
    программисту ничего не мешает написать что-то вроде

    PHP:
    $db = new MySQL('root''pass''db');
    $db_1 = new MySQL('root''pass''db');
    ....
    $db_1000 = new MySQL('root''pass''db');

    class 


    public function 
    getX(){
       
    $local_db  = new MySQL('root''pass''db');
       ....
    }
    }
     
Статус темы:
Закрыта.