PHP获取相应的数据,默认和错误处理

时间:2013-12-21 18:45:00

标签: php class object get

我有一个普通的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();
        }

1 个答案:

答案 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);