php ReflectionClass - PullRequest
       1

php ReflectionClass

0 голосов
/ 30 июля 2010

Привет всем, я хочу использовать ReflectionClass для загрузки некоторых классов определено в моем XML-файле

но я получаю ошибку

Error while register class :Class ReportErrorHandler does not exist

я не получу эту ошибку, когда буду использовать

require_once( 'handlers/system/ReportErrorHandler.php' );

но я не хочу требовать класса, вот почему я использую отражение и в моем XML-файле я пишу только имя класса без полного пути, поэтому я не могу динамически 'require_once'

вот мой код

 public function init(){
$doc = new DOMDocument();
$doc->load( 'server.xml' );

$handlers = $doc->getElementsByTagName( "handler" );
foreach( $handlers as $handler ) {
  $this->register($handler->nodeValue);
}
}

public function register(&$name) {
try{
  $intercafe = new ReflectionClass('Handler');

  $reflectionClass = new ReflectionClass($name);

  if(!$reflectionClass->isSubclassOf($intercafe)){
    //LOG ERROR
    error_log("Init-> Error ," + name + " is not a subclass of [net/Handler]");

    throw new InvalidArgumentException();
  }

  error_log("register: " . $reflectionClass);

  $handler  = $reflectionClass->newInstance();
  $type = $handler->getType();

  //LOG DEBUG
  syslog(LOG_DEBUG ,"Registering handler = " . $name . " TYPE = " . $type);

  $key = $type << 32;

  $this->table[$key] = $reflectionClass;
}catch(Exception $ee){
  error_log("Error while register class :" . $ee->getMessage());
}
}

мой xml файл

<?xml version="1.0" encoding="UTF-8"?>
  <server>
     <server-version>0.1</server-version>

     <handlers>
       <handler>AuthenticateHandler</handler>
       <handler>ReportErrorHandler</handler>

       <handler>DisconnectedHandler</handler>
       <handler>NoSuchRequestHandler</handler>
     </handlers>
  </server>

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

но я не хочу требовать_класса, вот почему я использую отражение

Даже рефлексия должна знать, что именно она должна отражать.Почему вы не хотите включать / требовать определения класса?

2 голосов
/ 30 июля 2010

Настройка Автозагрузка с

  • spl_autoload_register - Зарегистрировать данную функцию как __autoload() реализация
0 голосов
/ 31 июля 2010

это то, что сделано, чтобы решить мою проблему я выделяю полный путь для require_once

public function register(&$name) {
try{
  $intercafe = new ReflectionClass('Handler');

  $fullPath = $name;
  $className = $name;

  $index = strrpos($name , "/");
  if($index != False){
    $className = substr($name ,$index + 1);
  }

  $requirePath = 'handlers/' . $fullPath . '.php';
  require_once ( $requirePath );
  $reflectionClass = new ReflectionClass($className);

  if(!$reflectionClass->isSubclassOf($intercafe)){
    //LOG ERROR
    error_log("Init-> Error ," + name + " is not a subclass of [net/Handler]");

    throw new InvalidArgumentException();
  }

  $handler  = $reflectionClass->newInstance();
  $type = $handler->getType();

  //LOG DEBUG
  syslog(LOG_DEBUG ,"Registering handler = " . $name . " TYPE = " . $type);

  $key = $type << 32;

  $this->table[$key] = $reflectionClass;
}catch(Exception $ee){
  error_log("Error while register class :" . $ee->getMessage());
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...