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

Статус
В этой теме нельзя размещать новые ответы.

Raccoon

Участник
Регистрация
31 Июл 2007
Сообщения
176
Реакции
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

Как можно получить доступ к методам соседнего класса?
 
при создании класса misc.class.php нужно указать наследование класса 'Database'
class Misc extends Database {
}

и далее обращаться к методам через $this
$this->query($q);
 
за областью действия переменных следить не забываем:

PHP:
public function check_anything () {

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

$db->query($q);
}
 
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 - не слушай его ... - это он пошутил так
 
А если нужно создать 100 экземляров Misc? В твоём случае нужно создать 100 подключений к базе, получается так? А если по среди работы нужно вообще подключиться к другой бд, что тогда?
 
А если нужно создать 100 экземляров Misc? В твоём случае нужно создать 100 подключений к базе, получается так?
в примере что выше - да, будет 100 подключений ....

но обычно клас БД проектируют как Singleton, который лишен данного недостатка
Для просмотра ссылки Войди или Зарегистрируйся
А если по среди работы нужно вообще подключиться к другой бд, что тогда?
тогда класс делают по принцыпу "multi-Singleton-а" ... в классе хранят массив с подключениями и по какому-то запросу возвращают нужно подключение
 
в примере что выше - да, будет 100 подключений ....
но обычно клас БД проектируют как Singleton, который лишен данного недостатка
Обычно класс проектируют так, чтобы он выполнял исключительно свои задачи.

Для просмотра ссылки Войди или Зарегистрируйся
тогда класс делают по принцыпу "multi-Singleton-а" ... в классе хранят массив с подключениями и по какому-то запросу возвращают нужно подключение
Вообще-то всё куда проще, в класс просто отправляют запрос ну и название базы(примерно)/соединения в зависимости от того, как написан код, а уж сам класс сам соображает как ему работать с коннектами.

Поэтому логичней создать экземпляр класса для работы с бд, а потом из другого класса получить к нему доступ:
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`");
 }
}
?>

Тебе так не кажется?
 
Обычно класс проектируют так, чтобы он выполнял исключительно свои задачи.
ну оно так и будет

в ООП классах такого быть не должно, это противоречит принципам ООП и является гамнокодингом
 
ну оно так и будет
в ООП классах такого быть не должно, это противоречит принципам ООП и является гамнокодингом

Там такого не просто быть не должно, там такого быть просто не может. Но это не касается пхп, т.к. в пхп отсутствует родительский класс. Если уж тебе совсем не терпится, можно передать ссылку на экземпляр в класс, но иногда это создаёт столько проблем, что пц....
 
Там такого не просто быть не должно, там такого быть просто не может.

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


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`");
 }
}
?>
Тебе так не кажется?



Но это не касается пхп, т.к. в пхп отсутствует родительский класс.
как это в пхп отсутствует родительский класс?

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

class ChildClass extends  ParentClass{
}
думаю вам следует чуть глубже изучит ООП в целом, и в пхп в частности
неплохо начать со следующих статей
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

Если уж тебе совсем не терпится, можно передать ссылку на экземпляр в класс, но иногда это создаёт столько проблем, что пц....
в пхп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 A { 

public function getX(){
   $local_db  = new MySQL('root', 'pass', 'db');
   ....
}
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху