Реестр и маршрутизатор на php

661
01 августа 2017, 18:25

Активно осваиваю ООП на php. Нашел в интернете примеры реализаций паттерна registry и маршрутизатора router. Я плохо понимаю логику и некоторые функции. Прошу знающего человека просто прокомментировать каждую строку кода.

registry:

class Registry {
// тут мне не понятен только этот кусок кода и как он работает
    public static function instance () {
        if(self::$instance === null) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

router:

Class Router {
    private $registry;
    private $path;
    private $args = array();
    // получаем хранилище
    //function __construct($registry) {
    //  $this->registry = $registry;
    //}
    // задаем путь до папки с контроллерами
    function setPath($path) {
        $path = trim($path, '/\\');
        $path .= DS;
        // если путь не существует, сигнализируем об этом
        if (is_dir($path) == false) {
            throw new Exception ('Invalid controller path: `' . $path . '`');
        }
        $this->path = $path;
    }   
    // тут не понятен символ & и он сбивает меня с толку
    private function getController(&$file, &$controller, &$action, &$args) {
        $route = (empty($_GET['route'])) ? 'main' : $_GET['route'];
        unset($_GET['route']);
        // Получаем части урла
        $route = trim($route, '/\\');
        $parts = explode('/', $route);
        // Находим контроллер
        foreach ($parts as $part) {
            $fullpath = $this->path . $part;
            // Проверка существования папки
            if (is_dir($fullpath)) {
                $this->path .= $part . DS;
                array_shift($parts); // извлекает первое значение массива array и возвращает его, сокращая размер array на один элемент. Все числовые ключи будут изменены таким образом, что нумерация массива начнётся с нуля, в то время как строковые ключи останутся прежними.
                continue;
            }
            // Находим файл
            if (is_file($fullpath . '.php')) {
                $controller = $part;
                array_shift($parts);
                break;
            }
        }
        // если в урле не указан контролер, то используем по умолчанию index
        if (empty($controller)) {
            $controller = 'main'; 
        }
        // Получаем экшен
        $action = array_shift($parts);
        if (empty($action)) { 
            $action = 'index'; 
        }
        $file = $this->path . $controller . '.php';
        $args = $parts;
    }
    function start() {
        // Анализируем путь
        $this->getController($file, $controller, $action, $args);
        // Проверка существования файла, иначе 404
        if (is_readable($file) == false) {
            die ('404 Not Found');
        }
        // Подключаем файл
        include ($file);
        // Создаём экземпляр контроллера
        $class = 'Controller_' . $controller;
        $controller = new $class($this->registry);
        // Если экшен не существует - 404
        if (is_callable(array($controller, $action)) == false) {
            die ('404 Not Found');
        }
        // Выполняем экшен
        $controller->$action();
    }
}
Answer 1
// тут мне не понятен только этот кусок кода и как он работает
public static function instance () {
    if(self::$instance === null) {
        self::$instance = new self;
    }
    return self::$instance;
}

Это статический метод, создает объект такого же класса(Registry) и присваивает его статическому полю $instance, self указывает на текущий класс.

// тут не понятен символ & и он сбивает меня с толку
private function getController(&$file, &$controller, &$action, &$args) {
    $route = (empty($_GET['route'])) ? 'main' : $_GET['route'];
    unset($_GET['route']);

Символ & указывает на то что значение переменной будет передано по ссылке.

READ ALSO
Создание сайта с PHP [требует правки]

Создание сайта с PHP [требует правки]

Я всегда создавал сайты с HTML CSS тд

403
Рассылка почты из php скрипта через smtp

Рассылка почты из php скрипта через smtp

Здравствуйте, решил сделать рассылку писем через smtp, используя данный скрипт на php:http://i-leonru/smtp-php/

265