Разрешить экземпляру класса доступ к классу, включенному в создатель

У меня есть мой основной файл PHP, который запускается всякий раз, когда кто-то попадает на мой сервер. Это выглядит примерно так:

<?php

$config = require_once('./config/general.php');

define('ROOT', __DIR__.'/');

include(constant('ROOT').'libraries/log4php/Logger.php');
Logger::configure(constant('ROOT').'config/logging.xml');
$log = Logger::getLogger('main');

$requested_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$route_url = str_replace($config['baseURL'], '', $requested_link);
$route_url = $route_url == '' ? '/' : $route_url;

define('ROUTE', $route_url);

require_once 'routeme.php';

routeme.php находит лучший «маршрутный» класс для обработки запрошенного URL. Он создает экземпляр этого класса, а затем передает информацию запроса экземпляру класса маршрутизатора, который он создал для его обработки.

Все маршрутизаторы расширяют базовый класс:

<?php
namespace Blaze;
class Router {
private $log;

public function __construct() {

// The __CLASS__ constant holds the class name
$this->log = Logger::getLogger(__CLASS__);
}

public function routes (){
return array();
}
}

Пример роутера:

<?php
namespace Blaze;
class GeneralRouter extends Router {

public function RootRoute ($url){
$log->info($url);
}

public function routes (){
return array(
'/' => 'RootRoute'
);
}
}

когда я пытаюсь запустить приложение, оно терпит неудачу, потому что Router класс не видит включенного Logger класс из log4php (операторы журнала в главном файле, конечно, работают нормально). Я не могу повторно включить класс Logger для каждого маршрутизатора, потому что log4php позволяет включать его только один раз в приложение (возможно, для предотвращения конфликтов блокировки файлов). Как я могу позволить маршрутизатору получить доступ / увидеть класс Logger?

Решение должно быть расширяемым, т. Е. Позже у меня будет больше классов, таких как Router класс, который также должен получить доступ к классу Logger.

2

Решение

В вашем Router учебный класс, Импортировать класс Logger:

<?php

namespace Blaze;

use Logger;

class Router{
public function __construct(){
$this->log = Logger::getLogger(__CLASS__);
}
}

Если вы не импортируете Logger, при попытке вызвать его, PHP пытается получить класс Logger в том же пространстве имен:

Blaze\Logger

Если вы не хотите импортировать его, вы можете сделать:

$this->log = \Logger::getLogger(__CLASS__);

Тогда в вашем GeneralRouter:

public function RootRoute($url){
$this->log->info($url);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]