[英]Autoload Obscurity
我很抱歉,但是我不知道我是否能获得所有可能的细节,以便对到底发生了什么进行有根据的猜测。
我试图检查是否存在一个类,如果不存在,则需要创建该类。 一些类具有子类(命名空间)。
namespace {
class wattsjus {
}
}
namespace wattsjus {
class OtherClass {
}
}
因此,无论我__autoload wattsjus还是wattsjus \\ OtherClass,我都在加载这两个类。
如果可以尝试自动加载“内部类”,那么直到加载类之前,我都可以告诉他们。 加载类后,我得到一个错误,表明该类已被加载。 但是我可以在该点之前打印文本,并且永远不会到达该行。
我正在使用class_exists来确保未加载wattsjus类。 在加载类之前,这是真的(已加载)。 但是,如果我尝试创建wattsjus实例,将无法找到它。
我正在使用以下代码检查类的创建位置,并指出此时从未到达的行号。 为了确保这一点,我在这行之前有一份打印声明。
$reflector = new ReflectionClass('wattsjus');
echo $reflector->getFileName();
对于我来说,在不执行上一行代码的情况下如何达到代码是一个很大的谜。
编辑,警告这是丑陋的代码:
function __autoload($class_name) {
echo 'in';
$parts = explode('\\',$class_name);
if($class_name == $_GET['u5u'] || $parts[0] == $_GET['u5u']) {
$cl = class_exists($_GET['u5u'], false);
echo $cl ? 'yes' : 'no';
if(!$cl) {
if($_GET['e5e'] != 'Prod') { $env = $_GET['e5e']; }
$q = "SELECT f.`Name`, f.`$env"."ParameterList` `ParameterList` FROM `Function` f WHERE f.UserId = ".SiteUserId." AND `Status` = 'A' ORDER BY INSTR(f.`Name`, '\\\\') > 0, f.`Name`";
$results = DataObject::GetDBObject()->Query($q, 'wattsjus_json');
$class = "namespace { class $_GET[u5u] {";
$class .= GetFunctions($results);
$class .= '}}';
echo 'I\'m not here yet';
eval($class);
} else {
$reflector = new ReflectionClass('wattsjus');
echo $reflector->getFileName();
}
在这里,试图获取OtherClass的输出是:
inyes/home4/wattsjus/public_html/ajson/global_base.php(25) : eval()'d code<br />
<b>Fatal error</b>: Class 'wattsjus\OtherClass' not found in <b>/home4/wattsjus/public_html/ajson/global_base.php(112) : runtime-created function</b> on line <b>1</b><br />
所以对我来说,这就是说wattsjus类已经存在,应该在名称空间中包含OtherClass。 虽然找不到。 如果我继续进行下去并再次创建wattsjus,它将说该类已经定义。 我很困惑。
我更改了类的结构,以使用“名称空间wattsjus \\ OtherClass”,而不是创建OtherClass类,并且由于某些原因,PHP对此不太困惑。 我不得不说真的很奇怪的故障/错误。
namespace {
class wattsjus {
}
}
namespace wattsjus\OtherClass {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.