【问题标题】:Allow instantiated class to access class include in creator允许实例化类访问包含在创建者中的类
【发布时间】:2017-10-12 03:11:04
【问题描述】:

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

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

【问题讨论】:

    标签: php class logging global-variables log4php


    【解决方案1】:

    在您的Router 类中,import 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);
    }
    

    【讨论】:

    • 谢谢!这就是我近 3 年没有使用 PHP 编程得到的结果,哈哈
    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多