Oc-windows.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Site path php

pathinfo — Возвращает информацию о пути к файлу

(PHP 4 >= 4.0.3, PHP 5, PHP 7)

pathinfo — Возвращает информацию о пути к файлу

Описание

pathinfo() возвращает информацию о path в виде ассоциативного массива или строки в зависимости от options .

Список параметров

Если указан, то задает для возврата отдельный элемент: один из следующих PATHINFO_DIRNAME , PATHINFO_BASENAME , PATHINFO_EXTENSION и PATHINFO_FILENAME .

Если options не указан, то возвращаются все доступные элементы.

Возвращаемые значения

Если параметр options не передан, то возвращаемый ассоциативный массив ( array ) будет содержать следующие элементы: dirname, basename, extension (если есть) и filename.

Если path содержит больше одного расширения, то PATHINFO_EXTENSION возвращает только последнее и PATHINFO_FILENAME отрезает только последнее расширение. (смотрите пример ниже).

Если path не содержит расширения, то не будет возвращен элемент extension (см. ниже второй пример).

Если указан параметр options , будет возвращена строка ( string ), содержащая указанный элемент.

Список изменений

ВерсияОписание
5.2.0Добавлена константа PATHINFO_FILENAME .

Примеры

Пример #1 Пример использования функции pathinfo()

echo $path_parts [ ‘dirname’ ], «n» ;
echo $path_parts [ ‘basename’ ], «n» ;
echo $path_parts [ ‘extension’ ], «n» ;
echo $path_parts [ ‘filename’ ], «n» ; // начиная с PHP 5.2.0
?>

Результат выполнения данного примера:

Пример #2 Пример с pathinfo() , показывающий разницу между null и отсутствием расширения.

= pathinfo ( ‘/path/emptyextension.’ );
var_dump ( $path_parts [ ‘extension’ ]);

$path_parts = pathinfo ( ‘/path/noextension’ );
var_dump ( $path_parts [ ‘extension’ ]);
?>

Результатом выполнения данного примера будет что-то подобное:

Примечания

Подробнее о получении информации о текущем пути, обратитесь к секции » Предопределенные зарезервированные переменные».

pathinfo() учитывает настройки локали, поэтому для корректной обработки пути с многобайтными символами должна быть установлена соответствующая локаль с помощью функции setlocale() .

Смотрите также

  • dirname() — Возвращает имя родительского каталога из указанного пути
  • basename() — Возвращает последний компонент имени из указанного пути
  • parse_url() — Разбирает URL и возвращает его компоненты
  • realpath() — Возвращает канонизированный абсолютный путь к файлу

Tarlyun blog

Определяем корень сайта на php

Часто возникает необходимость подгрузить из одного скрипта другой. Всё хорошо, когда эти скрипты физически расположены в одном каталоге. Делаем include и нет проблем. Проблемы возникают при развитой системе скриптов. Когда исполняемые файлы сгруппированы по каталогам и нужно настроить взаимодействие между ними.

Для себя я решил, что проще всего понять где находится корневой каталог и уже от него подгружать другие скрипты.

Способ 1. Некрасивый

Способ, которым я пользовался более трех лет. Основная идея: получить путь к каталогу текущего файла и относительно этого каталога подгружать другие скрипты.
В переменной $_SERVER[«SCRIPT_FILENAME»] содержится абсолютный путь к скрипту. С помощью функций mb_strrpos и mb_substr мы вырезаем из исходной строки имя файла. В итоге в константе PATH будет содержаться текущий каталог.

define (‘PATH’, mb_substr($_SERVER[«SCRIPT_FILENAME»], 0, mb_strrpos($_SERVER[«SCRIPT_FILENAME»], «/»))); require_once(PATH.»/../connect.php»);

Плюсы данного решения

– Должен работать даже на самых древних версиях PHP.

– Инициализация константы происходит в одну строку.

Минусы данного решения

– В зависимости от вложенности скрипта, необходимо менять количество «../» . То есть, если вложенность один каталог:

Если вложенность 4 каталога:

– Весь этот код вообще не нужен ведь, начиная с PHP 5.3, появилась константа __DIR__ , которая содержит путь к каталогу.

– При запуске скрипта с консоли в $_SERVER[«SCRIPT_FILENAME»] будет содержаться относительный путь. То есть, если вы запускаете скрипт так:

В $_SERVER[«SCRIPT_FILENAME»] будет содержаться полный путь.

Но если вы сначала перейдете в каталог скрипта, а затем запустите его:

cd /var/www/sites/lgnd.ru/public_html/parser/test.php php test.php

то в $_SERVER[«SCRIPT_FILENAME»] будет содержаться только test.php

– На некоторых конфигурациях содержимое $_SERVER[«SCRIPT_FILENAME»] может быть пустым.

Способ 2. Элегантный, но не идеальный

В какой-то момент мне надоело постоянно менять вложенность. И я решил переписать этот говнокод.
Начиная с PHP 5.3, появилась удобная константа __DIR__ . Почему бы не воспользоваться ею?

Для начала определим: какое название имеет корневой каталог. В зависимости от настроек вашего веб-сервера, это может быть public_html , public , www или что-то другое. В константе __DIR__ будет такой путь:
/var/www/sites/lgnd.ru/public_html/parser

При помощи функции explode мы разобьем этот путь на две части. Разделителем будет служить название корневого каталога (в моем случае — public_html ). В итоге в $dir[0] будет содержаться левая часть (всё, что было до public_html ):
/var/www/sites/lgnd.ru/

К этой строке мы добавляем название корневого каталога и слэш.

$root_dir = ‘public_html’; $dir = explode($root_dir, __DIR__); define (‘PATH’, $dir[0].$root_dir.’/’); require_once(PATH.»/connect.php»);

Плюсы

– Будет корректно определён путь до корневого каталога, вне зависимости от вложенности скрипта.

– Нет проблем с относительным/абсолютным путем при работе из командной строки или при запуске в экзотических конфигурациях

– Не нужно постоянно указывать дополнительные «../» при переносе скрипта в другой каталог.

Минусы

– Требует PHP 5.3+

– Инициализация занимает больше строк и её нельзя сократить (записать три строки в одну не комильфо)

– Требует указания корневого каталога, а значит скрипт нельзя просто скопировать с одного сервера на другой

Способ 3. Нет предела совершенству

Дальнейшие улучшения способа номер 2.

В PHP 5.4 появилось разыменование массивов. Эта штука позволяет обращаться к результатам работы функции explode без создания временной переменной:

PHP 5.3

$dir = explode(‘public_html’, __DIR__); echo dir[0];

PHP 5.4

echo explode(‘public_html’, __DIR__)[0];

В итоге код из способа 2 становится более компактным:

$root_dir = ‘public_html’; define (‘PATH’, explode($root_dir, __DIR__)[0].$root_dir.’/’);

А если очень хочется всё записать в одну строку:

define (‘PATH’, explode(‘public_html’, __DIR__)[0].’public_html’.’/’);

Абсолютные и относительные пути в PHP

Пути к файлам — тема, которая обычно взрывает мозг новичкам. Но не волнуйся, сейчас мы всё расставим по полочкам.

Чем отличаются пути в PHP и URL

Когда мы смотрим любимый фильм или сериал, мы видим только готовый продукт.

А за кадром существует совсем другой, невидимый для нас мир: стилисты и гримёры, искусственные декорации, наложение спецэффектов и многое другое.

В PHP существует такое же разделение. С одной стороны — реальная файловая система с реальными папками и файлами, с другой — URL адреса, которые могут не иметь ничего общего с реальной файловой структурой.

Если ты видишь на каком-нибудь сайте страницу с URL /category/monitors — это совсем не значит, что на сайте есть скрипт /category/monitors/index.php .

Вполне вероятно, что и такой папки там тоже нет, а все URL адреса обрабатываются одним единственным PHP файлом.

И даже если в URL присутствует расширение файла, например /about.html — это тоже не говорит о существовании файла about.html . Может он есть, а может и нет.

Новички часто путают пути к реальным файлам с URL адресами. Сейчас я разберу пару таких ошибок, на примере которых можно будет прочувствовать разницу.

Ошибка №1: Подстановка физического пути в URL

Очень частая ошибка новичков — пытаться подставить в URL адрес ссылку на физический файл, вроде такого:

Это неправильно. Браузер не может видеть реальную файловую структуру сервера. Он не видит никаких дисков D, он видит только URL адреса.

Правильная ссылка выглядит так (разницу объясню чуть позже):

Ошибка №2: Подключение скриптов по URL

Иногда новички пытаются подключить физический файл по его URL:

Это неправильно. Во-первых, подключится не сам скрипт, а результат его работы. Во-вторых, подключать какие-то файлы через URL вообще идея очень опасная.

Абсолютный путь в PHP

Абсолютный путь — это полный путь к папке или файлу. Вот пара примеров для разных операционных систем:

  • D:OpenServerdomainstest.ruindex.php — для OpenServer на Windows
  • /var/www/html/test.ru/index.php — для Ubuntu

Как видите, это полный путь от корня диска до конкретного файла или папки. Начинается со слеша или буквы диска (Windows).

Получить абсолютный путь скрипта можно с помощью магической константы __FILE__ :

Для получения абсолютного пути к папке, в которой находится скрипт, есть магическая константа __DIR__ :

Как этим пользоваться. Допустим, у нас в корне сайта лежат файлы index.php и config.php и мы хотим подключить второй в первый.

Если мы хотим подключить config.php по его абсолютному пути, есть два способа сделать это:

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

Относительный путь в PHP

У относительных путей в PHP есть один подвох — они могут строиться относительно не той папки, от которой мы ожидаем.

Дело в том, что когда мы подключаем скрипт по относительному пути require(‘config.php’); , PHP будет искать его по следующему алгоритму:

Сначала PHP попытается найти этот файл в папках, указанных в директиве include_path. Посмотреть, что указано в этой директиве конкретно у вас можно с помощью var_dump(get_include_path()); , папки разделяются символом ;

Если мы укажем путь к скрипту в таком виде: require(‘./config.php’); , то этот шаг будет пропущен.

Далее PHP попытается найти файл в папке текущего рабочего каталога.

Например, если мы в index.php подключили файл scripts/script.php, а в этом самом script.php уже пытаемся подключить файл по относительному пути, тогда поиск файла произойдёт и в папке scripts тоже.

Два последних пункта — главная проблема относительных путей. Мы не можем быть уверены, что будет подключен именно тот файл, который нам нужен.

Именно по этой причине я призываю тебя отказаться от использования относительных путей в PHP.

Кому-то из практикующих разработчиков эта фраза может не понравиться, но я считаю это единственным разумным решением.

Тем более нет ничего сложного в добавлении константы __DIR__ перед именем скрипта, что автоматически сделает путь абсолютным.

Абсолютный путь в URL

Абсолютный путь в URL означает путь от корня сайта. Корень сайта — это папка, которая содержит публичную часть сайта, т.е. доступную извне.

По-умолчанию корень сайта — это сама папка с сайтом, например site.ru , но зачастую её меняют на site.ru/public , чтобы часть скриптов нельзя было запустить по прямой ссылке в браузере.

Есть несколько способов указать абсолютный путь в URL:

  • http://test.ru/article.php — полный путь с протоколом и доменом
  • //test.ru/article.php — полный путь без протокола (берётся из текущей страницы). Содержит два слеша в начале.
  • /article.php — полный путь без протокола и домена (берутся из текущей страницы). Содержит слеш в начале.

Второй и третий варианты удобны тем, что при миграции с http на https и обратно все ссылки автоматически сменят протокол, не нужно будет бегать по всему сайту и менять вручную.

Лично я практически всегда использую третий вариант, кроме случаев, когда нужно указать ссылку на другой поддомен (blog.site.ru, shop.site.ru и т.д.).

Относительный путь в URL

Относительные пути в URL указываются без слеша в начале ссылки, например:

Относительные пути в URL более предсказуемы, чем в PHP. Но я рекомендую использовать их только там, где это действительно необходимо.

Чаще всего их использование приводит к путанице. И вот пара типичных проблем, с которыми часто сталкиваются новички.

Ошибка №1: относительные пути к стилям, скриптам и другим файлам

Представим, что мы решили подключить стили к нашему сайту:

Разработчик указывает относительный URL style.css и видит, что всё работает. По крайней мере, на главной странице.

Но при переходе по любой ссылке, например /products/15 , стили перестают работать.

А причина в том, что относительный путь строится от текущего URL-адреса, а значит в нашем примере он из style.css превратился в /products/15/style.css .

Ошибка №2: Рекурсия в ссылках

При использовании относительных путей есть риск случайно создать на сайте бесконечные ссылки. Вот один из таких способов:

Для работы данного кода должна быть настроена единая точка входа.

Проблема в том, что при каждом клике по этой ссылке текущий URL будет не перезаписываться, а дополняться, в итоге через несколько кликов мы получим что-то вроде http://test.ru/articles/articles/articles/articles/about .

Текущий и родительский каталоги

Помимо указания конкретных папок, мы также можем добавить в путь указание «перейти на папку выше», например:

В коде выше мы подключим файл config.php, который находится не в текущей папке, а в родительской. С абсолютными путями это тоже работает:

И с URL-адресами тоже:

Также мы можем указать ссылку на текущий каталог, что бывает актуально в некоторых операционных системах:

Пример MVC в php. Вторая статья. Маршрутизация, контролеры, экшены, шаблоны и модели

Содержание цикла статей:

В этой статье мы напишем «каркас» нашего проекта. Под словом «каркас» я подразумеваю рабочий код, который будет иметь в своей основе MVC подход, то есть будет иметь четкое разделение логики на контролеры, экшены, шаблоны (представления) и модели.

И так начнем, как я уже писал в предыдущей статье, паттерн MVC подразумевает одну точку входа – index.php, через это скрипт будут проходить все запросы, через него будет работать вся логика проекта. Для того чтобы реализовать такой подход необходимо настроить сервер, подразумевается, что сайт работает на сервере apache, поэтому нам достаточно создать файл .htaccess, в котором мы укажем правила маршрутизации URL. Помимо определения точки входа, маршрутизация позволяет создавать ЧПУ(человеко-понятные урлы). То есть после правильной настройки, адреса страниц буду выглядеть вот так site.ru/article/new.
Для начала, давайте составим .htaccess, который перенаправит обработку всех страниц на скрипт index.php. Код выглядит вот так:

Файл .htaccess должен лежать в корневой папке сайта, тут же необходимо создать скрипт index.php, который является точкой входа. Давайте запишем в index.php одну строку, для проверки работы перенаправления:

Теперь можно проверять работу перенаправления, введите любой адрес и посмотрите, что получиться: test-mvc.web/sdf/sdf/ или test-mvc.web/sdf/sdf/2342/не важно, на экране в любом случае, должно появиться «Test». Если Вы увидели эту надпись, значит, у нас все получилось.
Продолжим, давайте для удобства создадим в корне сайта файл config.php, в котором будем задавать различные константы, облегчающие своим существование настройку сайта. Это могут быть различные пути к скриптам, подступы к базе данных и так далее. Сейчас в конфиге давайте зададим следующее:

Для того, чтобы константы и другие данные конфига мы могли использовать во всем проекте, в файле index.php необходимо подключить скрипт config.php.
Помимо подключения файла с настройками, в index.php нужно создать подключение к базе данных, подключить скрипт с ядром сайта и запустить роутер, в котором будет происходить маршрутизация.
Теперь по порядку, создание соединения с базой данных будет находиться в index.php для того, чтобы соединение открывалось только один раз. Единожды открыв соединение, мы сможем использовать его во всех контроллерах и моделях, но об этом чуть позже. Сейчас просто создадим соединение с базой. Для работы с бд я решил использовать PDO. Подробнее почитать про PDO можно тут .
Ядро сайта расположим в папке core и назовем скрипт core.php, тут мы напишем функцию, которая будет сама подключать, необходимы для работы классы. Такая функция очень облегчит и упростит нам работу с контролерами, моделями и тд. Поскольку, забегая вперед скажу, что каждый контролер и каждая модель будут представлять собой отдельный класс.
Помимо авто подключения классов, добавим в ядро создания хранилища (реестра), в котором будем хранить все необходимые объекты и переменные, которые могут пригодиться в любом месте проекта.
Роутер тоже подключим в индексном файле, он будет анализировать URL и подключать необходимый контроллер и экшен. Что такое контролер я писал в предыдущей статье, а информацию про экшен я пропустил умышленно, не став нагружать лишней информацией. Так что же такое экшен?
Контролер это класс, в котором заключены различные методы, при MVC подходе каждый метод будет являться экшеном. То есть экшен(action) – это метод класса, который будет обрабатывать данные и передавать их в представление (в шаблон). Может быть, пока не совсем понятно, но после примера все станет на свои места.
На данном этапе теории достаточно, давайте перейдем к практике. Приведу код файлов, работу которых, я описывал выше.
Код скрипта index.php:

Класс хранилища Registry.php, будет находиться в папке /classes/

Код файла router.php, который находиться в папке /classes/

Теперь необходимо создать папки для хранения контроллеров, шаблонов и моделей – в корне создадим три папки controllers, views и models. И создадим несколько тестовых файлов /controllers/index.php, /views/index/index.php и /models/model_users.php, а теперь заполним файлы:
Для контроллера:

Как вы могли заметить, класс контролера наследуется от родительского класса Controller_Base. Это сделано, для того, чтобы упростить класс контролера. Поскольку нам еще необходимо подключать класс для работы с шаблонами, его подключение вынесено в Controller_Base.
Приведу его код, он расположен в папке /classes/ и называется controller_base.php :

Теперь осталось только разобраться с шаблонами. В абстрактном классе Controller_Base мы вызываем класс Template и передаем ему имя шаблона и имя контроллера.
Код класса Template, который лежит тут /classes/ и называется template.php

Если вы внимательно прочитали код, то наверняка поняли, что для отображения на страницах у нас используется шаблон first_layouts и вьюха(отображение) index.php – ее код я приводил чуть выше. Все что нам осталось, это создать файл шаблона first_layouts. Расположим его в папке /views/layouts/first_layouts.php
Шаблон будет содержать вот такой код:

Вот и все, на этом создание «каркаса» закончено. Сейчас у нас получилась самая простая структура, использующая в своей основе паттерн MVC. В этой статье я не стал затрагивать работу с базой данных, только вскользь упомянул ее, поскольку статья и так получилась большая. Непосредственно работу с базой данных я опишу в следующей статье.
На этом статья закончена, скачать исходники можно архивом тут.

Читать еще:  Php pdo установка
Ссылка на основную публикацию
Adblock
detector