2015-09-11 3 views
1

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

Так что, когда я делаю:

1. <?php 
2. namespace TestTest; 
3. 
4. $myobj->doMethod(); 

Как $ myobj-> DoMethod() знать, что пространство имен в строке 4. это TestTest?

+0

__NAMESPACE__ постоянный. http://php.net/manual/en/language.namespaces.nsconstants.php В чем проблема? –

+1

@IgorGreg '__NAMESPACE__' относится к текущему пространству имен. Если он не передаст это в качестве аргумента, здесь это нехорошо. (Я предполагаю, что это не вариант) – rjdown

+0

@rjdown Это действительно не вариант. – Xesau

ответ

1

Это возможно, только если метод не вызывается из глобальной области. Это потому, что нет реального способа вернуть его (пожалуйста, кто-то меня поправьте сюда, если это не так!). Самое простое решение - поместить ваш вызов в функцию. Скорее всего, вы будете использовать метод в любом случае, если вы это делаете. Если это так, то вы можете использовать комбинацию функции debug_backtrace и класс отражения:

file1.php:

<?php 

namespace myns; 

require 'file2.php'; 

function example($class) { 
    echo $class->nstest(); 
} 

$class = new \myotherns\someclass(); 
echo example($class); 

file2.php:

<?php 

namespace myotherns; 

class someclass { 

    function nstest() { 
     $backtrace = debug_backtrace(); 
     $caller = end($backtrace); 
     $reflection = new \ReflectionFunction($caller['function']); 
     return $reflection->getNamespaceName(); 
    } 

} 

Или все в одном файле :

<?php 
namespace myns { 
    $someclass = new \myotherns\someclass(); 
    echo example($someclass); 
    function example($class) { 
     echo $class->nstest(); 
    } 
} 

namespace myotherns { 
    class someclass { 
     function nstest() { 
      $backtrace = debug_backtrace(); 
      $caller = end($backtrace); 
      $reflection = new \ReflectionFunction($caller['function']); 
      return $reflection->getNamespaceName(); 
     } 
    } 
} 

Вот online demo

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

+0

Я видел это раньше, но это не то, что я искал. Спасибо, в любом случае. – Xesau

+0

Тогда у вас нет вариантов :(Отражение - это единственный способ сделать это, не передавая его в качестве аргумента. – rjdown

Смежные вопросы