[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: extends ws global
Shurick
Только начал разбирать ООП. На данный момент хочу совместить все модули в еденном классе. Вопрос - как лучше обращаться к классам ?

есть класс Main который объединяет все модули.

index.php


require_once ("Main.php");
$main = new main();


Main.php


<?php

class
Main
{

// Свойства - Классы API
private $classes = array(
'db' => array('name' => 'Mysql',
'path' => 'Class.Mysql.php'),
'config' => array('name' => 'Config',
'path'=>'Class.Config.php'),
'catalog' => array('catalog' => 'Catalog',
'path' => 'Class.Catalo.php'),
);


// Созданные объекты
private static $objects = array();

/**
* Конструктор оставим пустым, но определим его на случай обращения parent::__construct() в классах API
*/

public function __construct()
{
}


/**
* Магический метод, создает нужный объект API
*/

public function __get($name)
{
// Если такой объект уже существует, возвращаем его
if(isset(self::$objects[$name]))
{
return(self::$objects[$name]);
}

// Если запрошенного API не существует - ошибка
if(!array_key_exists($name, $this->classes))
{
return null;
}

// Определяем имя нужного класса
$class = $this->classes[$name];

// Подключаем его
include_once($class[path]);

// Сохраняем для будущих обращений к нему
self::$objects[$name] = new $class[name]();

// Возвращаем созданный объект
return self::$objects[$name];
}

}

?>


Class.Catalog.php

Как лучше обращаться к внешним классам?


class Catalog extends Main {

public function Catalog(){

$result=$this->db->query("select * from `catalog`");
while ($res=$this->db->fetch_row($result)){
$arr[] = $res;
}
return $arr;

}

}



или так


class Catalog {

public function Catalog(){
global $main;

$result=$main->db->query("select * from `catalog`");
while ($res=$main->db->fetch_row($result)){
$arr[] = $res;
}
return $arr;

}

}





Спустя 10 минут, 44 секунды (5.03.2012 - 09:53) m4a1fox написал(а):
Кажется вот тут будет уместна __autoload();

Спустя 3 часа, 4 минуты, 29 секунд (5.03.2012 - 12:57) SlavaFr написал(а):
1) global не должен вообще употреблятся в классе.
Если нужна переменная то передавай ее лучше в класс посредством set-методов.

2) таким участкам
private $classes = array(
'db' => array('name' => 'Mysql',
'path' => 'Class.Mysql.php'),
'config' => array('name' => 'Config',
'path'=>'Class.Config.php'),
'catalog' => array('catalog' => 'Catalog',
'path' => 'Class.Catalo.php'),
);

в классе тоже нечего делать. путь к конфигурации должен передоватся как параметер. Ты ведь не хочеш при изменении имени конфига или при изменении его места менять класс котроый ты хочеш использовать многократно.

Спустя 7 минут, 47 секунд (5.03.2012 - 13:05) caballero написал(а):
обычно класс для работы с БД делают в виде синглетона - тогда вопросы отпадают автоматически


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.