-1

这是我的引导文件:

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

4 回答 4

1

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

class Test {
    private $error;

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

   public function test() {
      if( 1 == 1) {
        $this->error->methodError();
      }
      else {
            //
        $this->error->methodError();
      }
   }
}
于 2013-04-17T16:15:50.663 回答
0

您的实例化在 else 部分...如果代码从未进入 else 部分怎么办?然后$error将是未定义的。

顺便提一句。您不会创建两个对象,只需编写两次实例化对象的代码。

于 2013-04-17T16:13:37.657 回答
0

你可以通过移动这条线来解决这个问题:$error = new error();在 if 语句之上。然后,无论您的第一个 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();

                }
            }
        }
    }

}
于 2013-04-17T16:16:05.960 回答
0

您在 PHP 代码不总是执行的地方创建了第一个 $error。
作为快速解决方案,您可以再次定义 $error。

else {
    require '/../controllers/error.php';
    $error = new error();
    $error->methodError();  
}
于 2013-04-17T16:16:35.963 回答