2017-05-12 8 views
2

누군가 내 서버에 닿을 때마다 실행되는 기본 PHP 파일이 있습니다.인스턴스화 된 클래스가 생성자의 클래스 include에 액세스하도록 허용

<?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(); 
    } 
} 

예 라우터 : 나는 응용 프로그램을 실행하려고 할 때 Router 클래스가 포함되어 보지 않기 때문에

<?php 
namespace Blaze; 
class GeneralRouter extends Router { 

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

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

, 그것은 실패 Logger class from log4php (메인 파일의 로그 문은 물론 정상적으로 실행됩니다.) log4php는 응용 프로그램에 자기 자신을 한 번만 포함시킬 수 있기 때문에 라우터 당 클래스에 Logger 클래스를 다시 포함 할 수 없습니다 (아마도 파일 잠금 충돌을 방지하기 위해). 라우터가 Logger 클래스에 액세스하거나 보이게하려면 어떻게해야합니까?

해결책은 확장 가능해야합니다. 예를 들어 Logger 클래스에도 액세스해야하는 Router 클래스와 같은 나중에 더 많은 클래스를 갖게됩니다. 당신의 Router 클래스에서

답변

1

, import 로거 클래스 : 당신은 당신이 그것을 호출 할 때 로거를 가져 오지 않으면, PHP는 같은 네임 스페이스의 Logger 클래스를 검색하기 위해 노력하고있다

<?php 

namespace Blaze; 

use Logger; 

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

:

당신이 그것을 가져 오지 않는 경우
Blaze\Logger 

, 당신은 할 수 :

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

그 다음에 귀하의 GeneralRouter :

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

감사합니다! 이것은 내가 거의 3 년 동안 PHP로 프로그래밍하지 못하는 것입니다. –

+0

@KeithM You welcome :) –