-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、未定義になります。

ところで。2 つのオブジェクトを作成するのではなく、オブジェクトを 2 回インスタンス化するコードを記述するだけです。

于 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 に答える