我有一个非常简单的问题,但答案可能相当复杂。 "如何获取进行函数调用的块的命名空间?"
所以,当我这样做时:
1. <?php
2. namespace TestTest;
3.
4. $myobj->doMethod();
$ myobj-&gt; doMethod()如何知道第4行的命名空间是TestTest?
答案 0 :(得分: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
您需要根据最终调用方法的方式进行调整,但这应该很简单。