允许实例化的类访问创建器中包含的类



我有我的主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类看不到 log4php 中包含的 Logger 类(当然,主文件中的 log 语句运行良好(。我无法在每个路由器的基础上重新包含 Logger 类,因为 log4php 只允许它自己包含在应用程序中一次(可能是为了防止文件锁定冲突(。如何让路由器访问/查看记录器类?

解决方案必须是可扩展的,即我稍后将有更多的类,例如也需要访问 Logger 类的Router类。

Router类中,导入 Logger 类:

<?php
namespace Blaze;
use Logger;
class Router{
    public function __construct(){
        $this->log = Logger::getLogger(__CLASS__);
    }
}

如果不导入 Logger,当您尝试调用它时,PHP 会尝试检索同一命名空间中的 Logger 类:

BlazeLogger

如果您不想导入它,可以执行以下操作:

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

然后在您的GeneralRouter

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

相关内容

  • 没有找到相关文章

最新更新