我有一个普通的HTML菜单,可以将GET语句传递给url。
<li><a href="?Page=Home">Home</a></li>
就像这样,虽然这只是整个菜单中的1项。 在一个单独的文件中,我有一个函数来检查是否存在GET或POST语句, 如果它存在且不为NULL,那么它会将值返回到它被调用的位置。
public function getFormVariable($value){
switch (strtoupper($_SERVER['REQUEST_METHOD'])) {
case 'GET':
if (isset($_GET[$value]) && $_GET[$value] != NULL) {
return $_GET[$value];
}
else{
return false;
}
break;
case 'POST':
if (isset($POST[$value]) && $POST[$value] != NULL) {
return $POST[$value];
}
else{
return false;
}
break;
default:
return false;
}
}
使用以下代码获取get值并找到相应的类 (每个班级都在一个单独的文件中,每个班级在我的菜单中都是1个链接)
在这个课程中,只有一些常规的函数/数据可以提供该页面的内容。
$class = loadClass($ConfigPage->getFormVariable('Page'));
$ConfigPage->SetProperty('content', $class);
function loadClass($Page){
$class_name = 'Content' . $Page;
if(!class_exists($class_name)){
return 'Error: Content has not been found.';
}
$class = new $class_name();
return $class;
}
解释:菜单给出GET值'Contact',然后通过GetFormVariable()检查,然后找到相应的类,它返回类所持有的内容。
现在我的问题: 当函数LoadClass()无法找到通过GET语句给出的类的名称时,它应该返回一个错误字符串。但这不会发生。我从PHP中得到了一个漂亮的大橙色错误,说明如下:
致命错误:在非对象中调用成员函数render() 第147行的E:\ Program files \ wamp \ www \ BDW \ Class \ Html_Page.Class.php
第147行是对象的所在地
echo $ this-&gt; content-&gt; render();
Render函数就像内容类中的正常返回函数一样。 为什么我会收到此错误,我该如何解决?
第二个问题。如果网址中没有GET语句。它给出了完全相同的错误。这很合乎逻辑。但是当url中没有GET语句时如何让它显示ContentHome,而当GET语句的值不正确时如何显示ERROR。
感谢您的阅读, 如果有什么不清楚请告诉我。英语不是我的母语,毕竟。我在这里学习。
编辑: 我对PHP的了解还不够,所以我决定什么时候找不到类。它带你回家没有任何错误。这是我首先想要的。
这是我的新代码仍然无效,为什么?
$class = loadClass($ConfigPage->getFormVariable('Page'));
$ConfigPage->SetProperty('content', $class);
function loadClass($Page){
$class_name = 'Content' . $Page;
$Default_Class = 'ContentHome';
if(!class_exists($class_name)){
//echo 'Error: Content has not been found.';
$class = new $Default_Class();
return $class;
}
else{
$class = new $class_name();
return $class;
}
$ConfigPage->Render();
}
答案 0 :(得分:1)
这是因为这条线:
if(!class_exists($class_name)){
return 'Error: Content has not been found.';
}
如果该类不存在,则从函数返回一个字符串,然后尝试在其上调用方法render()。您可以通过更改此行为(不返回错误字符串,但使用Exception或trigger_error())或检查函数loadClass()确实通过is_object()返回有效对象来修复它。
关于第二个问题,您应该在loadClass()中扩展测试以处理空的GET变量大小写,并用“Home”默认值替换空字符串。
更新:
您的案例中is_object的示例用法:
$class = loadClass($ConfigPage->getFormVariable('Page'));
if(! is_object($class)) {
// if $class is not an object, then something went wrong above
throw new \Exception('Invalid data returned from loadClass()');
}
$ConfigPage->SetProperty('content', $class);