PHP получить пространство имен включенного файла - PullRequest
5 голосов
/ 22 декабря 2010
//file foo.php
<?php
namespace foo;
class foo{
    function __construct(){
        echo "hello";
    }
}
?>

//file index.php
<?php
require_once("foo.php");
echo __NAMESPACE__;
?>

Мой вопрос, из моего файла index.php, возможно ли узнать, что такое пространство имен foo.php, не читая содержимое файла и не делая с ним регулярное выражение? Это просто похоже на большие накладные расходы.

/// EDIT

Мне бы очень хотелось иметь возможность динамически добавлять пространство имен во включаемый файл.

<?php
namespace dynamic;
require_once("foo.php");
echo __NAMESPACE__;
?>

Я хочу разрешить сторонние плагины, но пространства имен php кажутся ужасными. Я не хочу, чтобы редакторы плагинов создавали пространство имен.

Ответы [ 4 ]

15 голосов
/ 22 декабря 2010

Нет.Но вы можете обмануть это так:

//file foo.php
<?php
  namespace foo;
  //...
  return __NAMESPACE__;  // must be last line
?>

И для чтения:

//file index.php
<?php
  $ns = require_once("foo.php");
5 голосов
/ 21 июля 2011

Хорошо, вы можете сканировать пространство имен класса.Он содержит пространства имен.Это PHPUnit способ делать вещи.То есть:

$namespaces = get_current_namespaces();

include 'plugin/main.php';

$newNamespaces = get_current_namespaces(); 
array_diff($namespaces, $newNamespaces)

Вот как вы можете реализовать get_current_namespaces(): можно ли получить список определенных пространств имен

4 голосов
/ 26 октября 2015

Если вы знаете файл, вы можете просто извлечь пространство имен из него:).

function extract_namespace($file) {
    $ns = NULL;
    $handle = fopen($file, "r");
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            if (strpos($line, 'namespace') === 0) {
                $parts = explode(' ', $line);
                $ns = rtrim(trim($parts[1]), ';');
                break;
            }
        }
        fclose($handle);
    }
    return $ns;
}

И вы не будете обязаны возвращать в конце файла что-то, что может быть нарушено при выходе или других инструкциях возврата.

0 голосов
/ 29 марта 2011

Я разработал довольно трудоемкий ручной способ сделать это.

Как обсуждалось сверху, сам процесс прост:

  1. получите ваш список файлов для каждого файла.Теперь для каждого файла:
  2. создайте случайный идентификатор пространства имен
  3. обрезайте файл и замените первый начальный тег
  4. добавьте идентификатор пространства имен и начальный тег в файл
  5. записать во временный файл
  6. импортировать временный файл
  7. сделать любое необходимое отражение, затем очистить

У меня есть пример с некоторым зендом здесь ... вероятно, нетнаиболее эффективный, но он работает.

<code><?php
//first setup zend
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__)."/../zend/library/");
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace(dirname(__FILE__)."/../zend/library/");

//include my extender class
class Zend_Reflection_File_WithNamespace extends Zend_Reflection_File {
    public function getFunctionsWithNamespace($namespace = '', $reflectionClass = 'Zend_Reflection_Function')
    {
        $functions = array();
        foreach ($this->_functions as $function) {
            $newName = $namespace . "\\" . $function;
            $instance = new $reflectionClass($newName);
            if (!$instance instanceof Zend_Reflection_Function) {
                require_once 'Zend/Reflection/Exception.php';
                throw new Zend_Reflection_Exception('Invalid reflection class provided; must extend Zend_Reflection_Function');
            }
            $functions[] = $instance;
        }
        return $functions;
    }
}

//find file(s)
$startDir = 'hello/';
//$tempDir = 'php://temp/resource=';
$tempDir = 'temp/';
$fileList = scandir($startDir);

function ppPrintR($data) {
    echo "<pre>";
    print_r($data);
    echo "
";} // Теперь перебираем каждый файл, сначала записываем в temp, включая, а затем тестируем foreach ($ fileList как $ key => & $ fileItem) {if (is_file)($ startDir. $ fileItem)) {// Взять файл и преобразовать его $ findDir = $ startDir. $ fileItem; echo $ startDir. $ fileItem; $ inContents = file_get_contents ($ findDir); $ randIden = 'm'. preg_replace ('/\.|\s/', '', microtime ()); // Заменить«;$ functions = $ отражениеFile-> getFunctionsWithNamespace ($ randIden);эхо 'После«;// Теперь foreach функция, чтение параметров и рассмотрение исполнения foreach ($ functions as & $ functionItem) {echo $ functionItem-> name.""; $ functionParams = $ functionItem-> getParameters (); ppPrintR ($ functionParams);} // FIXME должен очистить здесь}}?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...