загрузка тела класса PHP из внешнего файла - PullRequest
2 голосов
/ 24 июня 2011

Я хочу включить внешний файл в качестве тела класса, что-то вроде этого:

//$key is alphanumeric
$className='_Module_'.$key;
if(!class_exists($className))
{
    eval(' class '.$className.' extends ModuleContext');
    {
        ...include the file here...
    }
}
eval('$instance=new '.$className.'();');

Это делает то, что я хочу:

//$key is alphanumeric
$className='_Module_'.$key;
if(!class_exists($className))
{
    //There's got to be a better way to do this
    $contents=rtrim(ltrim(trim(file_get_contents($fileName.'.php',true)),'<?php'),'?>');
    //All on one line to preserve line numbering for errors
    eval(' class '.$className.' extends ModuleContext{ '.$contents.' }');
}
eval('$instance=new '.$className.'();');

Мне не нравится использовать evalвключить весь файл, потому что он генерирует непонятные сообщения об ошибках:

PHP Fatal error:  Call to undefined function doFoo() in test/test.php(57) : eval()'d code on line 7

, и я читал в других постах, что код eval () не использует ускорители php.Кроме того, требуется некоторое обрезание, чтобы удалить'тэги, поскольку они не очень хорошо работают внутри определения класса.

Включенный файл должен быть "дружественным к пользователю" для тех, кто знаком с PHP, но не для объектно-ориентированного программирования - он будет иметьнесколько предопределенных функций, которые должны быть заполнены разработчиком модуля.

Есть ли способ сделать это, не используя eval для включения?

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Если я вас правильно понимаю, в идеале вы должны расширить свой класс, а не пытаться оценить специальное тело для вашего класса:

class ClassA {
  public function greet( $msg ) {
    echo $msg;
  }
}

class ClassB extends ClassA {
  public function wave( $times ) {
    echo sprintf("Waves %s times!", $times);
  }
}

$instance = new ClassB();
$instance->greet("Hello World");
$instance->wave("five");

Обратите внимание, как я могу построить из моегокласса, добавляя новые функциональные возможности и свойства к его «телу».

0 голосов
/ 24 июня 2011

Может быть проблема в том, что не используется короткий открывающий тег?

...