OOP中的非对象错误

时间:2013-04-17 16:06:04

标签: php

这是我的引导程序文件:

class Bootstrap {

function __construct() 
{
    $url = $_GET['url'];
    //удаляем слеш с конца, чтобы избежать ошибки метода
    $url = rtrim($url,'/');
    //делим по слешу
    $url = explode('/',$url);
    //print_r($url);
    $file = 'controllers/' . $url[0] . '.php';
        if(file_exists($file)) 
    {
    require 'controllers/' . $url[0] . '.php';
        $controller = new $url[0];
    }
    else 
    {
    require '/../controllers/error.php';
    $error = new error();
    $error->classError();
    return false;
    }


    if
    (isset($url[2])){
        $controller->{$url[1]}($url[2]);
    }
    else
    {
    if(isset($url[1])){
    if(method_exists($url[0],$url[1])) {
        $controller->{$url[1]}();
        }
        else {
        $error->methodError();

        }
    }
    }
}

}

如你所见,我在这里创建了一个对象,并调用了classError函数:

else 
    {
    require '/../controllers/error.php';
    $error = new error();
    $error->classError();
    return false;
    }

然后我想在另一个地方调用另一种方法:

else {
    $error->methodError();  
    }

它说: 致命错误:在第39行的Z:\ home \ localhost \ www \ oop \ mvc \ mvc \ libs \ bootstrap.php中的非对象上调用成员函数methodError()。

当我为methodError方法创建另一个对象时,它可以工作。问题是,为什么我要创建另一个对象,如果我已经创建了一个对象?

4 个答案:

答案 0 :(得分:1)

您的对象不是为其他条件创建的。

class Test {
    private $error;

    function __construct() {
      $this->error = new error();
    }

   public function test() {
      if( 1 == 1) {
        $this->error->methodError();
      }
      else {
            //
        $this->error->methodError();
      }
   }
}

答案 1 :(得分:0)

你的实例化是另一个部分......如果代码永远不会进入else部分怎么办?然后$error将不确定。

顺便说一下。你不会创建两个对象,只编写代码来实例化对象两次。

答案 2 :(得分:0)

你可以解决这个问题,在if语句之上移动这一行:$error = new error();。然后,无论在第一个if语句中发生什么,使对象可用于下一个if语句,您的对象都将被创建。

class Bootstrap {

    function __construct() {
        $url = $_GET['url'];
        //??????? ???? ? ?????, ????? ???????? ?????? ??????
        $url = rtrim($url,'/');
        //????? ?? ?????
        $url = explode('/',$url);
        //print_r($url);
        $file = 'controllers/' . $url[0] . '.php';

        $error = new error();

        if ( file_exists($file)) {
            require 'controllers/' . $url[0] . '.php';
            $controller = new $url[0];
        } else {
            require '/../controllers/error.php';
            $error->classError();
            return false;
        }


        if (isset($url[2])) {
            $controller->{$url[1]}($url[2]);
        } else {
            if(isset($url[1])) {
                if(method_exists($url[0],$url[1])) {
                    $controller->{$url[1]}();
                } else {
                    $error->methodError();

                }
            }
        }
    }

}

答案 3 :(得分:0)

您在PHP代码不会始终执行的位置创建第一个$ error 作为快速解决方案,您可以再次定义$ error。

else {
    require '/../controllers/error.php';
    $error = new error();
    $error->methodError();  
}