Предопределённые константы
DIRECTORY_SEPARATOR ( string ) PATH_SEPARATOR ( string ) Точка с запятой в Windows, двоеточие в других системах. SCANDIR_SORT_ASCENDING ( int ) SCANDIR_SORT_DESCENDING ( int ) SCANDIR_SORT_NONE ( int )
User Contributed Notes 3 notes
In PHP 5.6 you can make a variadic function.
/**
* Builds a file path with the appropriate directory separator.
* @param string $segments. unlimited number of path segments
* @return string Path
*/
function file_build_path (. $segments ) return join ( DIRECTORY_SEPARATOR , $segments );
>
file_build_path ( «home» , «alice» , «Documents» , «example.txt» );
?>
In earlier PHP versions you can use func_get_args.
function file_build_path () return join ( DIRECTORY_SEPARATOR , func_get_args ( $segments ));
>
file_build_path ( «home» , «alice» , «Documents» , «example.txt» );
?>
For my part I’ll continue to use this constant because it seems more future safe and flexible, even if Windows installations currently convert the paths magically. Not that syntax aesthetics matter but I think it can be made to look attractive:
$path = join ( DIRECTORY_SEPARATOR , array( ‘root’ , ‘lib’ , ‘file.php’ );
?>
class RegisterController extends Controller /*
|—————————————————————————
| Register Controller
|—————————————————————————
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
?php
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = ‘/home’ ;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct ()
$this -> middleware ( ‘guest’ );
>
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator (array $data )
return Validator :: make ( $data , [
‘name’ => ‘required|string|max:255’ ,
’email’ => ‘required|string|email|max:255|unique:users’ ,
‘password’ => ‘required|string|min:6|confirmed’ ,
]);
>
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create (array $data )
return User :: create ([
‘name’ => $data [ ‘name’ ],
’email’ => $data [ ’email’ ],
‘password’ => bcrypt ( $data [ ‘password’ ]),
]);
>
>
?>
Result:
Предопределенные константы в PHP
В РНР есть ряд предопределенных констант. Например, PHP_VERSION и PHP_0S содержат соответственно версию РНР и название операционной системы, на которую установлен сервер.
Предопределенная константа DIRECTORY_SEPARATOR содержит разделитель пути. Для Windows это «\», для Linux и остальных — «/». Так как Windows понимает оба разделителя, достаточно использовать в коде разделитель Linux вместо константы.
Тем не менее, DIRECTORY_SEPARATOR полезен. Все функции, отдающие путь (вроде realpath ), отдают его с специфичными для ОС разделителями. Чтобы разбить такой путь на составляющие как раз удобно использовать константу:
$segments = explode(DIRECTORY_SEPARATOR, realpath(__FILE__));
Существуют так же несколько «магических» констант. Они могут менять свое значение в зависимости от их использования. Например, константы __LINE__ и __FILE__ содержат в себе соответственно номер строки и имя файла сценария.
Некоторые предопределенные константы
- PHP_OS — Операционная система, под которую собирался PHP
- PHP_VERSION — Текущая версия PHP
- PHP_EOL — Символ конца строки, используемый на данной платформе
- DIRECTORY_SEPARATOR — Разделитель пути
Магические константы
- __LINE__ — Текущий номер строки в файле
- __FILE__ — Полный путь и имя текущего файла
- __DIR__ — Директория файла, эквивалентно вызову dirname(__FILE__)
- __FUNCTION__ — Имя функции
- __CLASS__ — Имя класса, содержит название пространства имен, в котором класс был объявлен
- __TRAIT__ — Имя трейта, имя содержит название пространства имен, в котором трейт был объявлен
- __METHOD__ — Имя метода класса
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (99)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (146)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (68)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (27)
- Ключ (28)
- Команда (68)
- Компонент (60)
- Конфигурация (62)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (140)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (99)
- Сервер (74)
- Событие (27)
- Теория (105)
- Установка (66)
- Файл (47)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
когда использовать DIRECTORY_SEPARATOR в коде PHP?
Вышеприведенный код из плагина из WordPress. Я не понимаю, почему половина из них использует DIRECTORY_SEPARATOR, но другая половина использует «/»?
«DIRECTORY_SEPARATOR не обязательно нужен, PHP всегда конвертирует / в соответствующий символ в своих файловых функциях».
windows понимает использование «/» в качестве разделителя каталогов. Я запускаю код PHP на Linux и Windows без каких-либо изменений. Я всегда использую ‘/’ в путях к файлам и т. Д. Основная проблема заключается в том, что windows не чувствительны к регистру в отношении имен файлов, поэтому важно всегда использовать правильный регистр букв в окнах, иначе он не будет работать при перемещении в linux ,
Это важно только в том случае, если вы хотите запустить свой код в разных операционных системах, использующих файловую систему, в которой разделитель каталогов отличается, как в Windows или Linux. Я работаю только на Apache в Linux (даже под Windows 10 вы можете использовать Apache с Ubuntu Subsystem). Поэтому я все кодирую косой чертой.
2 ответа
Потому что в разных ОС существует другой разделитель каталогов. В Windows это \ в Linux это / . DIRECTORY_SEPARATOR является постоянным с этим разделителем каталога ОС. Используйте его каждый раз в пути.
В вашем фрагменте кода мы четко видим код плохой практики. Если framework/cms широко используются, это не означает, что он использует код наилучшей практики.
Да, это то, что ОП намеревается узнать, является ли это просто плохой практикой или это служит какой-либо цели, чтобы оба были в одной строке? И ваш комментарий на самом деле является одним из возможных ответов на вопрос.
Я не думаю, что необходимо использовать константу. Я всегда использовал / в моих путях, и они работают как в Windows, так и в Unix. Я думаю, что PHP достаточно умен, чтобы сделать преобразование.
хотя нет особого смысла использовать DIRECTORY_SEPARATOR в коде WordPress, поскольку встроенные функции WordPress его не используют, они просто используют прямые косые черты (немного непоследовательно, как в обсуждаемом коде). В WordPress вам просто нужно ожидать сочетания прямой и обратной косой черты, используемой в качестве разделителей каталогов. Но для PHP вне фреймворка или, по крайней мере, вне WordPress, я думаю, что вы правы, DIRECTORY_SEPARATOR лучше. См. Cmljnelson.wordpress.com/2018/07/26/…
Я также использую / на обоих окнах и Unix, но есть одна загвоздка, о которой люди должны знать. Это может укусить вас, если вы манипулируете путями. Например, если вы вызовете dirname (__ FILE__) в Windows, вы получите обратную косую черту. Если вы затем попытаетесь использовать str_replace () или preg_replace () для замены части пути с помощью косой черты в шаблоне поиска, совпадений не будет. Я всегда нормализую пути с помощью $ path = str_replace (‘\\’, ‘/’, $ path) перед выполнением любых преобразований.
Не используйте свои собственные разделители папок. Всегда используйте DIRECTORY_SEPARATOR, потому что:
- В некоторых особых случаях вам действительно нужен правильный разделитель путей
- ОС может справиться с этим правильно, но многие сторонние приложения не могут и могут потерпеть неудачу!
- Некоторые операционные системы не используют/или\как разделители, а что-то другое
Не забывайте: используйте константу только в удаленной системе — не используйте ее для URI или чего-либо еще, что вы хотите отправить клиенту (за исключением того, что вам это действительно нужно, например «удаленный браузер» ).
Ещё вопросы
- 0 Получить параметр URL на контроллере Spring из приложения Angular
- 1 Автоматизация NonEnglish сайт, используя WebDriver
- 0 как установить Zend Framework 2 на моем сервере общего хостинга
- 0 Angular.js каскадный выпадающий список — отображение двух моделей
- 0 После указания аргумента placer в boost :: bind, почему он опускается при вызове?
- 0 boost :: mutex поддерживает try_lock_for в Visual Studio, но не в Xcode
- 1 ICAL Recurrence RULE Generation (RRULE)
- 0 Параметры: где они объявлены?
- 0 Проверьте минимальное значение переменной общей стоимости и отобразите предупреждение, если оно меньше минимального значения
- 1 Получите оптимальный размер предварительного просмотра видео для высокоскоростной видеосессии
- 0 Как использовать React JSX внутри угловой директивы
- 1 Механика исполнения ворот в Maven
- 0 PHP, упорядочить массив различных объектов по полю
- 1 Gmail, не получающий определенные сообщения, отображается в отправленной папке
- 1 Java Rect.intersects () иногда не работает
- 1 Не удается получить электронную почту из FirebaseAuthentication на Android / iOS
- 0 Есть ли простой способ найти последнюю дату дня недели в текущем месяце?
- 1 MOXy XmlNameTransformer для нескольких пакетов
- 0 Изменить базу данных при выборе входа
- 0 Как настроить несколько классов в моем случае
- 0 Как сделать родительский ли активным, когда ребенок меняется
- 0 Chrome заблокирован localhost с ошибкой ваше соединение не является частным
- 1 обновить фрейм данных по индексам, возвращаемым запросом
- 1 словарь ключа и списка — удалить ключ, если какое-либо значение в списке отсутствует
- 0 угловой, как передать объект от контроллера к сервису
- 1 response-native-firebase NullPointerException при выпуске сборки для Android
- 0 Использование Composer для автозагрузки Doctrine 1 в Zend Framework 2
- 1 Интеграция служб WCF (ESB?)
- 1 Ошибка доступа к базе данных из приложения MVC 4
- 1 Как вы компилируете приложение фляги с Cython?
- 1 как изменить имя файла изображения в андроид студии?
- 1 Как мне получить доступ к enum по int или по строке
- 1 Как создать вложенный массив объектов JSON, используя Python?
- 0 Регулярное выражение для соответствия всем между <>, которое находится в квадратных скобках
- 0 Скользящая Div от левого угла к правому углу анимации
- 1 предложения по разработке JFrame
- 0 Почему объединение таблиц не работает в symfony2?
- 1 Фоновые геозоны действительно работают на Android 8+?
- 0 Обновить div с JSF 2.0
- 1 Повторите задачу в течение срока с задержкой
- 0 Создать сообщение об успешной отправке формы php
- 0 Я получаю ОШИБКУ 1452 (23000) в MySQL
- 1 Попытка обновить цвет фона на chart.js
- 0 Как добавить данные json к определенному индексу в другом json, используя angularjs
- 0 Динамически применять атрибуты к элементам DOM в ngRepeat в директиве
- 1 Проблема прозрачности с opengl / lwjgl
- 0 HTML KickStart — восстановить стиль по умолчанию для полей ввода
- 1 Чтение из нескольких обменов RabbitMQ в клиенте Java не опрос
- 1 Добавить более одного видео
- 0 Разобрать $ routeParams в объекте config