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

Lieroes

Новичок
Добрый день,
Сейчас пытаюсь написать свой движок для своей маленькой CMS.
И не получается обратиться из router.php, к объекту класса Currency объявленному в system.php - $currency.
Если в router.php подключить файл currency.php и объявить объект, то все будет ок, это тогда придется в каждом файле инклюдить файлы и объявлять объект.
Подскажите пожалуйста..

index.php
PHP:
<?php
require 'includes/System.php';

$system = System::getInstance();
?>
system.php
PHP:
<?php

require 'includes/Router.php';
require 'includes/Currency.php';
require 'includes/functions.php';
require 'config.php';

class System {

    private static $_instance = null;

    private function __construct() {
        session_start();
        $router = Router::getInstance();
        $currency = Currency::getInstance();
        $currency->setDefault();
        // проверка сконфигурирован ли сайт
        if ($this->configIsDone()) {
            // проверка используется ли тема, если нет - использовать тему по умолчанию
            if (!$this->themeInUse()) {
                // путь к теме, по умолчанию
                define(THEME_PATH, 'themes/default/');
                $router->route();
            } else {
                $path = mysql_result(mysql_query("SELECT `param1` FROM `settings` WHERE title = 'theme_path' "), 0);
                define(THEME_PATH, $path);
                // путь к файлу темы index.php
                $pathToIndex = THEME_PATH . 'index.php';
                if (file_exists($pathToIndex)) {
                    $router->route();
                } else {
                    // выполнить код, если файла index.php не существует
                }
            }
        } else {
            // если сайт не сконфигурирован, переадресация по этой ссылке
            header('location: control/index.php');
        }
    }

    private function __clone() {
        
    }

    private function configIsDone() {
        $status = mysql_result(mysql_query("SELECT `param1` FROM `settings` WHERE title = 'config' "), 0);
        return $status;
    }

    private function themeInUse() {
        $status = mysql_result(mysql_query("SELECT `param1` FROM `settings` WHERE title = 'theme_in_use' "), 0);
        return $status;
    }

    public static function getInstance() {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

}

?>
router.php
PHP:
<?php

class Router {
    
    private static $_instance = null;

    // При получении параметра $page, работает ELSE с правилами переадрессации, в противном случае,
    // если функция не получает параметр $page, то срабатывает переадрессация по параметру GET[page].
    public function route($page = null) {
        if (isset($page)) {
            if ($page == 'index') {
                require (THEME_PATH . 'index.php');
            }
            else if ($page == 'settings') {
                header('Location: control-panel/index.php');
            }
        }
        elseif (isset($_GET[page])) {
            $page = $_GET[page] . '.php';
            if (file_exists(THEME_PATH . $page)) {
                КАК ТУТ ОБРАТИТЬСЯ К МЕТОДУ ОБЪЕКТА $currency, СОЗДАННОМУ В system.php
            }
            else {
                require (THEME_PATH . 'index.php');
            }
        }
        else {
            require (THEME_PATH . 'index.php');
        }
    }
        
    public static function getInstance() {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    private function __construct() {
        
    }
    
    private function __clone() {
        
    }
   
}

?>
currency.php
PHP:
<?php

class Currency {
    private static $_instance = null;

    // Если валюта не установлена - установить, в противном случае ничего не менять (оставить текущую).
    public function setDefault() {
        if (!(isset($_SESSION['currency']))) {
            $default_currency = mysql_result(mysql_query("SELECT `title` FROM `currency` WHERE id = (SELECT `param1` FROM `settings` WHERE `title` = 'default_currency')"), 0);
            $_SESSION['currency'] = $default_currency;
        }
    }
    
    // Установить новую валюту
    public function change($currency) {
        $_SESSION['currency'] = $currency;
    }
    
    // Конвертация цена по курсам валют
    public function getPrice($amount) {
        $default_currency = mysql_result(mysql_query("SELECT `title` FROM `currency` WHERE id = (SELECT `param1` FROM `settings` WHERE `title` = 'default_currency')"), 0);
        if ($_SESSION['currency'] == $default_currency) {
            return $amount;
        }
        else {
            $rate = mysql_result(mysql_query("SELECT `rate` FROM `currency` WHERE title = '$_SESSION[currency]'"), 0);
            return $rate * $amount;
        }
    }
    
    public static function getInstance() {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    private function __clone() {
        
    }

    private function __construct() {
        
    }
}

?>
 

Lieroes

Новичок
Только сегодня прочитал об этом шаблоне, в первые применил. Опыта мало =) до этого писал все функционально.. хочется разобраться. Буду даже признателен, если укажите на ошибки, не касающиеся сабжа этой темы.
 
Последнее редактирование:

Lieroes

Новичок
P.S. разобрался, надо было include файлов делать не перед классом, а в конструкторе. Сейчас все работает и доступ ко всем объектам есть из любого файла в проекте. В любом случае будет интересно выслушать критику и советы профессионалов.
 

hell0w0rd

Продвинутый новичок
познай spl_autoload_* и композер. Хватит подключать файлы самостоятельно, тем более в конструкторах. Конструктор создает объект
 
  • Like
Реакции: WMix
Сверху