Handling page requests in MVC Is this an efficient way to handle page requests in MVC?

index.php:

require 'Classes/Autoloader.php';
Autoloader::start();
Session::start();

new Bootstrap();


Bootstrap.php

class Bootstrap {
    private $controller = null,
            $action = null,
            $args = null;

    public function __construct() {
        $this-&gt;manage_url();
        if($this-&gt;page_exist()){
            $this-&gt;request();
        } else {
            $error = new ErrorController();
            $error-&gt;error404();
        }
    }

    private function request(){
        $controller = new $this-&gt;controller();
        if(!$this-&gt;args){ $controller-&gt;{$this-&gt;action}(); }
        else{
           $count_args = count($this-&gt;args);
           switch ($count_args) {
               case 1:
                   $controller-&gt;{$this-&gt;action}($this-&gt;args[0]);
                   break;
               case 2:
                   $controller-&gt;{$this-&gt;action}($this-&gt;args[0], $this-&gt;args[1]);
                   break;
               case 3:
                   $controller-&gt;{$this-&gt;action}($this-&gt;args[0], $this-&gt;args[1], $this-&gt;args[2]);
                   break;
               case 4:
                   $controller-&gt;{$this-&gt;action}($this-&gt;args[0], $this-&gt;args[1], $this-&gt;args[2], $this-&gt;args[3]);
                   break;
           }
        }
    }

    /**
     * Get controller, action and parametes
     */
    private function manage_url(){
        $uri = $_SERVER['REQUEST_URI'];
        $uri = trim($uri, '/');
        $this-&gt;remove_query_or_hash($uri);
        $exploded_uri = explode('/', $uri);
        $this-&gt;controller = Util::istruthy_or($exploded_uri[0], 'Main').'Controller';
        $this-&gt;action = Util::istruthy_or($exploded_uri[1], 'index');
        $this-&gt;args = array_slice($exploded_uri, 2);
    }

    private function remove_query_or_hash(&amp;$uri){
        $query = strpos($uri, '?');
        $hash = strpos($uri, '#');
        if($query!==FALSE||$hash!==FALSE){
            $idx =  $query &lt; $hash ? $hash : $query;
            $uri = substr($uri, 0, $idx);
        }
    }

    private function page_exist(){
        $controller = class_exists($this-&gt;controller);
        $method = method_exists($this-&gt;controller, $this-&gt;action);
        if(!$controller||!$method){
            return FALSE;
        }
        return TRUE;
    }
}


Util istruthy_or():

public static function istruthy_or(&amp;$var, $val = NULL){
    return isset($val) ? ($var ? $var : $val) : ($var ? $var : NULL);
}
MVC is a concept that stems from good OOP practices. It's about seperating your application to three different parts: InputControllers, ProcessingModel and OutputView.

What you are describing is the bootstrap page, which, at least from my perspective should not be a class.

Here's my approach to this:

index.php

&lt;?php
require "../bootstrap.php";


bootstrap.php

&lt;?php
//Pseudo-code ahead:
require autoloader;
start router;
add router rules (either from file, or actually in the code)
$route = $router-&gt;route($uri); //$route is a Route object which tells us 
                               //what controller to use, what are the parameters, etc.
$controllerClass = $route-&gt;getControllerClass();
$controllerAction = $route-&gt;getControllerAction();
$controller = new $controllerClass($request); 
//Where $request is the Request object, containing the URI, GET, POST, COOKIES, etc.
$viewParams = call_user_func_array([$controller, $controllerAction], $route-&gt;getParameters());
//$route-&gt;getParameters() is an array of parameters from the route.
//call_user_func_array will transform that array into actual arguments to pass in.

$viewClass = $viewParams["class"];
$viewAction = $viewParams["action"];
$view = new $viewClass($request);
echo $view-&gt;render($viewParams);