В дальнейшей работе мне понадобится много обращаться к адресной строке браузера и на основе запроса пользователя перенаправлять его на нужную страницу.

Для этого я написал класс для работы с URL в нём я активно использую стандартную функцию PHP parse_url() и свой класс DataCleaner для очистки.

Здесь я тоже посторался учеть как можно больше вариантов использования которые мне могут понадобиться в дальнейшем.

Покажу весь код сразу:

<?php

class UrlParse
{
    private $url   = [];
    private $query = [];

    public function __construct()
    {
        $this->url   = explode('/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
        $this->query = explode('&', parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY));
    }

    /**
     * Возвращает массив частей URL расделённых /
     * @return array
     */

    public function getUrlPath() :array
    {
        
        return DataCleaner::cleanStringArray($this->url);

    }

    /**
     * Возвращает количество элементов в массиве URL 
     * @return int
     */

    public function getCountUrlPath() :int
    {
        return count($this->getUrlPath());
    }

    /**
     * Возвращает значение массива URL по ключу
     * Если значение ключа больше чем элеменов массива
     * вернёт пустую строку
     *
     * @param int $num
     * @return string
     */

    public function getByNumUrlPath($num) :string
    {
        if(!is_int($num)) {
            throw new Exception('Передан неверный тип параметра в метод ' . __METHOD__ .
            ' здесь ожидается число');
        }

        $url = DataCleaner::cleanStringArray($this->url);
        
        $col = $this->getCountUrlPath();

        if($num > $col) {
            return '';
        }
        return $url[$num];
        
    }

    /**
     * Возвращает следующий элемент URL после запрашиваемого
     * если запрашиваемый элемент последний
     * вернёт пустую строку
     * @param string $query
     * @return string
     */

    public function getNextUrlPath($query) :string
    {
        $key  = array_search($query, $this->url);

        if (array_key_exists($key + 1, $this->url)) {
            $item = $this->url[$key + 1];
            $item = DataCleaner::cleanString($item);
            return $item;
        }

        return '';
    }

    /**
     * Возвращает массив с запросов в URL
     *
     * @return array
     */

    public function getQueryUrl() :array
    {

        return DataCleaner::cleanStringArray($this->query);

    }

    /**
     * Возвращает значение запроса в URL по ключу
     * если ключ не существует
     * вернёт пустую строку
     *
     * @param string $key
     * @return int|string
     */

    public function getQueryValueUrl($key)
    {

        foreach ($this->query as $item) {
            $keyQuery = explode('=', $item);
            if ($keyQuery[0] === $key) {
                $value = $keyQuery[1];
                return $value;
            }
        }
        return '';
    }


}

Теперь посмотрим что получилось, буду разбирать условный URL mysite.ru/cpanel/users/?user=23&post=12

Метод getUrlPath() — Возвращает массив частей URL расделённых /

array (size=4)
  0 => string '' (length=0)
  1 => string 'cpanel' (length=6)
  2 => string 'users' (length=5)
  3 => string '' (length=0)

Метод getCountUrlPath() — Возвращает количество элементов в массиве URL

Метод getByNumUrlPath() принимает в качестве параметра число и возвращает значение массива URL по ключу. Если значение ключа больше чем элеменов массива вернёт пустую строку

Метод getNextUrlPath() — Возвращает следующий элемент URL после запрашиваемого. Если запрашиваемый элемент последний вернёт пустую строку.

Метод getQueryUrl() — Возвращает массив с запросов в URL.

Метод getQueryValueUrl($key) — Возвращает значение запроса в URL по ключу. Если ключ не существует вернёт пустую строку.