 
  
  class Router {
	
	private $routes;
	
	public function __construct(){
		
		$routerPath = ROOT.'/routing/routes.php';
		$this->routes = include($routerPath);
		
	}
	
	private function getURI(){
		
		if(!empty($_SERVER['REQUEST_URI'])){
			return trim($_SERVER['REQUEST_URI'], '/');
		}
		
	}
	
	public function Run(){
		
		$uri = $this->getURI();
		
		if(!array_key_exists($uri, $this->routes)){
			echo "Такой старницы нет!";
			//Перенаправить на 404.
			exit();
		}
		
		foreach($this->routes as $pattern=>$path){
			
			if($pattern == $uri){
				
				$controllerAndAction = explode('/',$path);
				
				//Узнаем имя контроллера и экшена:
				$controllerName = $controllerAndAction[0];
				$actionName = $controllerAndAction[1];
				
				//Назначаем имена файлу контроллера:
				$controllerFileName = $controllerName . 'Controller.php';
				
				//Подключаем файл контроллера:
				include ROOT . '/controllers/'.$controllerFileName;
				
				//Создаем класс контроллера:
				$controllerObject = new $controllerName;
				
				//Вызываем метод класса контроллера:
				$result = $controllerObject->$actionName();
				
				}
			}
	}
}
?> 
  
  а далее чтобы цепочка сама выполнилась
class Test {
	
	public $c;
	
	public function x(){
		$this->c = $this->z() + 5;
		return $this->c;
	}
	
	private function z(){
		return 5;
	}
}
$ccc = new Test();
echo $ccc->x();
// Выводит: 10. 
  
   
  
  А можете привести примемеры сайтов, если вам не сложно?держи: https://www.google.com/search?q=%D1%81%D0%B5%D1%80...
 
  
  Простым способом разместил файл в базе
// Все проверки картинки выше...
//Генерация случайного имени картинки:
$_FILES['image']['name'] = md5(time() . uniqid($more_entropy=true)) . "." . $image_extension;
$sql = 'INSERT INTO items SET
	        name = :name,
	        description = :description,
	        price = :price,
	        date = NOW(),
	        category_id = :category_id,
	        address = :address,
	        image = :image,
	        user_id = :user_id';
	    $s = $pdo->prepare($sql);
	    $s->bindValue(':name', $_POST['name']);
	    $s->bindValue(':description', $_POST['description']);
	    $s->bindValue(':price', $_POST['price']);
	    $s->bindValue(':address', $_POST['address']);
	    $s->bindValue(':category_id', $_POST['category_id']);
	    $s->bindValue(':image', $_FILES['image']['name']);
	    $s->bindValue(':user_id', $_SESSION['id']);
	    $s->execute();
	    
$file_name = $_FILES['image']['name'];
// Уменьшаем картинку. Берем из tmp_name и туда же возвращаем уменьшенную.
imageResize($_FILES['image']['tmp_name'], 700);
	    
$file_tmp = $_FILES['image']['tmp_name'];
move_uploaded_file($file_tmp,"../images/".$file_name);	
header("Location:/"); 
  
   
  
   
  
  $uri; // текущий uri страницы
$allow; // разрешенный адрес
if($uri == $allow){
 $result = ImageDispatcher::giveImage($id); // Статический метод класса-диспетчера который отдает картинки и живет в index.php
}
else {
 $result = 'Доступ к файлу запрещен!';
}
Суть контроллера - понять что хочет юзер анализируя адресную строку и вызвать нужный метод контроллера в зависимости от запроса юзера.