Узнать текущую директорию php

Узнать текущую директорию php

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

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

Некоторые магические константы PHP

Имя Описание
__LINE__ Текущий номер строки в файле.
__FILE__ Полный путь и имя текущего файла с развернутыми симлинками. Если используется внутри подключаемого файла, то возвращается имя данного файла.
__DIR__ Директория файла. Если используется внутри подключаемого файла, то возвращается директория этого файла. Это эквивалентно вызову dirname(__FILE__). Возвращаемое имя директории не оканчивается на слеш, за исключением корневой директории.
__FUNCTION__ Имя функции или в случае анонимной функции.
__CLASS__ Имя класса. Это имя содержит название пространства имен, в котором класс был объявлен (например, FooBar). Обратите внимание, что начиная с PHP 5.4 __CLASS__ также работает в трейтах. При использовании в методах трейтов __CLASS__ является именем класса, в котором эти методы используется.
__TRAIT__ Имя трейта. Это имя содержит название пространства имен, в котором трейт был объявлен (например, FooBar).
__METHOD__ Имя метода класса.
__NAMESPACE__ Имя текущего пространства имен.
ClassName::class Полное имя класса (с указанием пространства имен). См. также ::class.

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

Версия Описание
5.5.0 Добавлена магическая константа ::class
5.4.0 Добавлена константа __TRAIT__
5.3.0 Добавлены константы __DIR__ и __NAMESPACE__

User Contributed Notes 8 notes

the difference between
__FUNCTION__ and __METHOD__ as in PHP 5.0.4 is that

__FUNCTION__ returns only the name of the function

while as __METHOD__ returns the name of the class alongwith the name of the function

class trick
<
function doit()
<
echo __FUNCTION__;
>
function doitagain()
<
echo __METHOD__;
>
>
$obj=new trick();
$obj->doit();
output will be —- doit
$obj->doitagain();
output will be —— trick::doitagain

The __CLASS__ magic constant nicely complements the get_class() function.

Sometimes you need to know both:
— name of the inherited class
— name of the class actually executed

Here’s an example that shows the possible solution:

class base_class
<
function say_a ()
<
echo "’a’ — said the " . __CLASS__ . "
" ;
>

function say_b ()
<
echo "’b’ — said the " . get_class ( $this ) . "
" ;
>

class derived_class extends base_class
<
function say_a ()
<
parent :: say_a ();
echo "’a’ — said the " . __CLASS__ . "
" ;
>

function say_b ()
<
parent :: say_b ();
echo "’b’ — said the " . get_class ( $this ) . "
" ;
>
>

$obj_b = new derived_class ();

$obj_b -> say_a ();
echo "
" ;
$obj_b -> say_b ();

?>

The output should look roughly like this:

‘a’ — said the base_class
‘a’ — said the derived_class

‘b’ — said the derived_class
‘b’ — said the derived_class

В данном уроке мы разберемся с типовой задачей, которая возникает во время работы над проектом PHP: получение списка файлов и директорий. Обсудим несколько базовых и более изощренных подходов, с перечисление плюсов и минусов каждого. Первые три решения будут использовать типовые функции PHP, а затем представим более надежное с применением итераторов SPL.

Для предметного обсуждения решения и демонстраций предположим, что структура директорий имеет следующий вид:

Базовые решения

Первый набор решений основан на использовании функции glob() , комбинации функций opendir() , readdir() и closedir() , и также функции scandir() .

Использование glob()

Первое решение базируется на использовании функции glob(), которая позволяет выполнять поиск пути с помощью шаблонов. Функция имеет два параметра:

  • $pattern (обязательный): шаблон поиска
  • $flags (опциональный): один или несколько флагов, описание которых можно найти в документации
Читайте также:  Industrial metal лучшие группы

Рассмотрим примеры. Для поиска в директории всех файлов и директорий, имена которых заканчиваются на .txt, следует использовать код:

Если вывести переменную $filelist , то получим:

Если нужен список файлов и директорий, имена которых начинаются на “te”, то код будет выглядеть так:

А вывод имеет вид:

А для получения списка только директорий с именами, содержащих “ma”, используем код:

Последний пример выведет:

Обратите внимание, что в последнем примере использован флаг GLOB_ONLYDIR в качестве второго параметра функции. Поэтому файл master.dat исключен из списка. Хотя функция glob() очень проста в использовании, иногда она недостаточно гибкая. Например, нет флага для получения только файлов (без директорий), которые соответствуют шаблону.

Используем opendir() , readdir() , и closedir() .

Второй подход к получению списка файлов и директорий, который мы обсудим, заключается в использовании функций opendir() , readdir() , и closedir() .

Функция opendir() открывает директорию и возвращает дескриптор соединения. Как только дескриптор получен, можно использовать функцию readdir() . С каждым обращением данная функция выдает имя следующего файла или директории внутри открытого каталога. Если все имена уже были перечислены, функция возвращает false. Для закрытия дескриптора используется функция closedir() .

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

Ниже приведенный пример возвращает список имен файлов и директорий начинающихся на “te”:

При выполнении выше приведенного кода, переменная $entry будет содержать такие включения, как “.” и “..”. Это две виртуальные директории, которые имеются в каждом каталоге файловой системы. Они представляют текущий каталог и родительский каталог соответственно.

Второй пример выводит только файлы, содержащиеся в заданном каталоге.

Пример выдаст следующее:

Использование scandir()

В завершение представим функцию scandir() . Она имеет только один обязательный параметр: путь для чтения. Функция возвращает массив файлов и директорий, расположенных по указанному пути. Для получения списка файлов и директорий по определенному критерию нужно выполнить дополнительную фильтрацию. С другой стороны, решение получается более кратким и не требует управления дескрипторами.

Данный пример показывает, как получить список файлов и каталогов, имена которых начинаются на “te”:

Воспользуемся итераторами SPL

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

Одно из преимуществ итераторов заключается в том, что они являются классами и их можно расширить для удовлетворения собственных нужд. Другой плюс состоит в том, что итераторы имеют собственные методы, которые являются полезными при решении множества типовых задач и располагаются в одном месте. Посмотрите на пример использования FilesystemIterator в сравнении с readdir() . Оба метода применяют цикл, но в случае readdir() вы обрабатываете только строку, а FilesystemIterator работает с объектом, который может содержать дополнительную информацию о файле или директории (размер, владелец, права доступа и так далее).

Конечно, PHP представляет возможность для получения такой информации с помощью функций,например filesize() и fileowner(). Но PHP5 основан на использовании концепции ООП. Поэтому лучше использовать современные методы работы с языком программирования. На нашем сайте есть уроки, посвященные работе с итераторами.

Как уже сообщалось во водной части урока, мы рассмотрим использование FilesystemIterator , RecursiveDirectoryIterator и GlobIterator . Первый наследуется от DirectoryIterator , а остальные от FilesystemIterator . Они все имеют один и тот же конструктор, который принимает два параметра:

  • $path (обязательный): путь к пункту файловой системы, над которым совершаются операции
  • $flags (опциональный): один или несколько флагов, перечисленных в документации

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

FilesystemIterator

Использовать FilesystemIterator очень просто. Рассмотрим в действии. Представляем два примера. Первый показывает поиск всех файлов и каталогов, имена которых начинаются на “te”. Второй пример использует другой итератор RegexIterator для поиска всех файлов и каталогов, имена которых заканчиваются на “t.dat” или “t.php”. Итератор RegexIterator используется для фильтрации результата на основе регулярных выражений.

Читайте также:  Как настроить сервер teamspeak 3

Выше приведенный код выдаст результат, аналогичный предыдущим примерам.

Второй пример с применением RegexIterator :

Он будет выводить:

RecursiveDirectoryIterator

Итератор RecursiveDirectoryIterator обеспечивает интерфейс для рекурсивного прохода по директориям файловой системы. Он имеет несколько полезных методов, таких как getChildren() и hasChildren() , которые возвращают итератор для текущего места, если это директория, и проверяют, является ли текущая точка входа директорией. Следующий пример демонстрирует использование RecursiveDirectoryIterator и getChildren() . Результат будет такой же, как и в предыдущих примерах.

GlobIterator

Итератор GlobIterator выполняет проход по файловой системе также, как и функция glob() . Первый параметр может включать шаблон для имени. Пример демонстрирует использование GlobIterator с тем же результатом, что и ранее.

Заключение

В данном уроке демонстрируется использование различных подходов для достижение одинаковой цели: получение списка файлов и директорий. Следует запомнить следующие ключевые моменты:

  • Функция glob() является встроенным решением, но она недостаточно гибкая.
  • Решение на основе opendir() , readdir() , и closedir() более сложное и требует дополнительной фильтрации, но оно более гибкое.
  • Функция scandir() требует дополнительной фильтрации, но работает без обработки дескриптора.
  • Если вы используете подход ООП, то следует применять библиотеку SPL. Дополнительно вы можете расширить классы своим функционалом.
  • Итератор GlobIterator имеет функцию предварительной фильтрации, а другие используют RegexIterator .

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: phpmaster.com/list-files-and-directories-with-php/
Перевел: Сергей Фастунов
Урок создан: 13 Ноября 2012
Просмотров: 99895
Правила перепечатки

5 последних уроков рубрики "PHP"

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Что как и почему в WordPress

Сначала — выбор пути к файлу или каталогу, затем — чтение из каталога и/или чтение из файла.

Путь к файлу

Абсолютный путь — это полный путь к файлу от корневого каталога (папки) в файловой системе.

В то время как абсолютный путь к файлу в Windows начинается с имени диска (например, "C:/www/html/file.html"), абсолютный путь к файлу страницы с веб-адресом //mysite.ru/file1.php, которая находится на Unix-сервере (Apache), имеет вид

где userlogin — логин пользователя на сервере.

Слеш (/) обозначает корневой каталог.

Путь к каталогу, который является корневым для веб-сайта, задается в кофигурации сервера и содержится в системной php-переменной

В данном случае это ""/home/userlogin/public_html/mysite.ru"".

"/myplugin/file2.php" полный путь от корня сайта (адрес соответствующей веб-страницы — "//site.ru//myplugin/file2.php")

Это значит, что в ссылках на локальные страницы сайта можно указывать только путь от корня сайта (без протокола и домена) "/myplugin/file2.php".
Относительный путь — это путь относительно документа, в котором используется ссылка на файл.

Например, пусть в папке сайта "myplugin" есть файл file2.php и папка "images", в которой находится файл "image1.jpg". Путь к файлу изображения из файла file2.php: "images/image1.jpg".

Но если в начале этого пути добавить слеш (/) , т.е. написать "/images/image1.jpg", это будет путь к другому файлу, который находится в другой папке "images" в корне сайта mysite.ru (см. рисунок).

Читайте также:  Двухпоршневой автомобильный компрессор отзывы

Чтобы подняться на директорию вверх, нужно написать"../".

Например, в файле file2.php можно указать на файл файл file1.php (в корневой папке сайта) как на файл в родительском каталоге "../file1.php" или в корневом каталоге "/file1.php".

"/tmp/file.html" полный путь от корня сайта (соответствующий веб-адрес "//site.ru//tmp/file.html")
"tmp/data/" путь относительно текущего каталога ("tmp" — это подкаталог текущего каталога, а "data" — подкаталог каталога "tmp")
"./images/" подкаталог текущего каталога
"file.php" файл в текущем каталоге
"./file.php" файл в текущем каталоге
"../" родительский каталог
"../file.php" файл в родительском каталоге
"../../file.php" файл в каталоге, который на два уровня выше текущего каталога

Функции для работы с именами файлов и каталогов

bool file_exists(string $name) проверяет, существование файла или каталога с заданным именем
if ( !file_exists("file.txt") ) exit("Файл не существует");
string basename(string $path) возвращает имя файла из полного пути (т.е. имя файла без пути)
string dirname(string $path) возвращает имя каталога из полного пути; для текущего файла: dirname(__FILE__)
array pathinfo (string path [, int options]) возвращает ассоциативный массив, который содержит элементы пути path: dirname, basename и extension.
options позволяет задать, какие элементы будут возвращены: PATHINFO_DIRNAME, PATHINFO_BASENAME и PATHINFO_EXTENSION.
string realpath(string $path) преобразует относительный путь в абсолютный, например, в сценарии, расположенном в корневой папке:
echo realpath("file1.php"); // выведет /home/userlogin/public_html/mysite.ru/file1.php
string tempname(string $dir, string $prefix) генерирует (уникальное) имя временного файла
is_readable($path) проверяет возможность чтения файла или каталога***
bool is_dir(string $path) возвращает TRUE, если $path — это путь к существующему каталогу ***.
bool is_file ( string $path ) возвращает TRUE, если $path — это путь к существующему файлу (результат кэшируется***).
string getcwd (void) возвращает текущий каталог (например, "/home/userlogin/public_html/mysite.ru/myplugin")
int chdir( string $dir ) изменяет текущий каталог (переходит в заданный каталог)
boolean chroot (string $path) изменяет корневой каталог

*** Результаты функций, возвращающих информацио о состоянии файлов, кэшируются. Это функции stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype() и fileperms().
Если во время выполнения php-скрипта состояние файла может изменяться, и это нужно проверять, следует очищать кэш. Это делает функция clearstatcache();

Чтение каталога

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

resourse opendir (string $path) открывает каталог, например, текущий каталог можно открыть так:
opendir(‘.’);
string readdir (resource $handle) Возвращает имя следующего по порядку элемента каталога, для которого создан дескриптор $handle (порядок следования элементов зависит от файловой системы).
void rewinddir (resource $handle) сбрасывает дескриптор каталога $handle (чтобы он указывал на начало каталога)
void closedir ($handle) закрывает каталог

Чтение каталога без создания дискриптора:

array scandir (string $path [, int order]) возвращает массив файлов и каталогов из заданного каталога, ессли каталог не найден, возвращает FALSE и генерирует сообщение об ошибке уровня E_WARNING.
По умолчанию элементы сортируются в алфавитном порядке, а если необязательный параметр order равен 1, — по убыванию.
array glob ( string pattern [, int flags] ) возвращает массив файлов и каталогов, пути к которым соответствуют заданному шаблону pattern, а в случае ошибки возвращает FALSE.
флаги:
GLOB_MARK — добавляет слеш к каждому возвращаемому пути
GLOB_NOSORT — возвращает файлы без сортировки
GLOB_NOCHECK — возвращает шаблон , если не был найден ни один файл.
GLOB_NOESCAPE — обратные слеши не экранируют метасимволы
GLOB_BRACE — раскрывает для совпадения с ‘a’, ‘b’ или ‘c’
GLOB_ONLYDIR — возвращает только катологи

Все файлы с расширением ".txt" из папки "texts" в корневой папке сайта:

Продолжение — о чтении данных из файла — в следующей статье, которая называется
"Чтение файлов и каталогов в php-сценарии, продолжение: файлы".

Чтение файлов и каталогов в php-сценарии : 1 комментарий

Да есть плагин Wp-editor для этих целей. Весьма функциональный.

Ссылка на основную публикацию
Adblock detector