允许实例化 class 访问 class 包含在创建者中
Allow instantiated class to access class include in creator
我的主要 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
找到最好的 "routing" class 来处理请求的 url。它实例化 class 然后将请求信息传递给它创建的路由器实例 class 以供处理。
所有路由器都扩展了一个base class:
<?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
class 没有看到 log4php 中包含的 Logger
class (当然,主文件 运行 中的日志语句很好)。我不能在每个路由器的基础上重新包含 Logger class,因为 log4php 只允许它自己在应用程序中包含一次(可能是为了防止文件锁定冲突)。如何让 Router access/see Logger class?
解决方案必须是可扩展的,即我以后会有更多 classes,比如 Router
class 也需要访问 Logger class。
在您的 Router
class、import 记录器中 class:
<?php
namespace Blaze;
use Logger;
class Router{
public function __construct(){
$this->log = Logger::getLogger(__CLASS__);
}
}
如果您不导入 Logger,当您尝试调用它时,PHP 会尝试在同一命名空间中检索 Logger class:
Blaze\Logger
如果你不想导入它,你可以这样做:
$this->log = \Logger::getLogger(__CLASS__);
然后在你的 GeneralRouter
:
public function RootRoute($url){
$this->log->info($url);
}
我的主要 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
找到最好的 "routing" class 来处理请求的 url。它实例化 class 然后将请求信息传递给它创建的路由器实例 class 以供处理。
所有路由器都扩展了一个base class:
<?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
class 没有看到 log4php 中包含的 Logger
class (当然,主文件 运行 中的日志语句很好)。我不能在每个路由器的基础上重新包含 Logger class,因为 log4php 只允许它自己在应用程序中包含一次(可能是为了防止文件锁定冲突)。如何让 Router access/see Logger class?
解决方案必须是可扩展的,即我以后会有更多 classes,比如 Router
class 也需要访问 Logger class。
在您的 Router
class、import 记录器中 class:
<?php
namespace Blaze;
use Logger;
class Router{
public function __construct(){
$this->log = Logger::getLogger(__CLASS__);
}
}
如果您不导入 Logger,当您尝试调用它时,PHP 会尝试在同一命名空间中检索 Logger class:
Blaze\Logger
如果你不想导入它,你可以这样做:
$this->log = \Logger::getLogger(__CLASS__);
然后在你的 GeneralRouter
:
public function RootRoute($url){
$this->log->info($url);
}