Composer dump autoload что делает
Перейти к содержимому

Composer dump autoload что делает

  • автор:

autoload при помощи composer

Composer это менеджер пакетов для PHP. Подробно о работе с ним можно почитать тут, тут или тут.

С помощью composer мы можем не только собрать проект из различных библиотек, но и просто создать autoloader для своих классов.

Нам понадобится установленный composer , посмотреть как установить можно тут. Мы можем описать правила по которым autoloader будет искать файлы классов. Рекомендуется использовать формат psr-0 так как этот формат обладает большей гибкостью.

Структура проекта следующая

project_structure

Создаем в корне тестового проекта файл composer.json и прописываем в нем требуемые для автоподключения классы:

в формате classmap

в формате files

includes/ во всех листингах — это директория в которой лежат файлы с нашими классами.

Переходим в корень нашего проекта выполняем команду composer install

composer_log

Теперь в корне проекта находится директория vendor с нашим autoloader. Ниже приведен код файлов, отвечающих за подключение наших классов в зависимости от формата по которому мы создавали composer.json .

в формате classmap . Поскольку в composer.json было прописано подключить всю директорию, без разбора, подключились также классы, которые мы не добавляли в composer.json в других форматах.

в формате files

Все что остается сделать, это подключить файл autoload.php , который находится в директории vendor , в нашем проекте

При добавлении новых классов, прописываем их в composer.json , выполняем команду composer dump-autoload и они попадают в наш автозагрузчик. Все!

Composer для самых маленьких

Когда я первый раз разбирался с composer, я набросал для себя маленькую шпаргалку и теперь, спустя некоторое время представляю её на суд общественности в несколько доработанном виде.
Данная публикация актуальная для тех, кто в первый раз столкнулся с незаменимым менеджером пакетов для PHP.

Итак, Composer — менеджер пакетов для PHP.

Для чего нужен Composer и простейший пример его использования

Возьмем для примера этот проект
Если в двух словах: то это набор скриптов для работы в VK API
Соответственно, для работы этих скриптов нужно несколько библиотек
Библиотеки перечислены в файле composer.json — ключевой файл при работе с composer

В этом проекте используется 5 библиотек. Соответственно, если разработчик решит опубликовать этот проект на github, то ему достаточно закинуть в репу саму папку со скриптами и составить composer.json, в котором будут описаны библиотеки, необходимые для работы этого проекта. Простота очевидна: в репу не нужно вслед за файлами прицепом тащить все нужные библиотеки. Занимает меньше места, проще распространять проект.

В папке scripts лежат непосредственно скрипты проекта, для работы которых и требуются эти 5 пакетов.

Запускаем установку пакетов:

После установки появляется папка vendor, куда складываются установленные пакеты и формируется файл autoload.php

Этот файл подключаем к проекту и всё — библиотеки подключены, можно спокойно с ними работать.

Простота очевидна: не нужно скачивать и подключать библиотеки и их зависимости самостоятельно, composer всё сделает за Вас. И вся эта пачка подключается одним единственным файлом autoload.php
Все пакеты, которые лежат в vendor, добавляются в автозагрузчик. При этом composer опирается на файлы composer.json, которые должны быть у каждого пакета. Формирование composer.json пакета — это задача разработчика пакета, от потребителя пакета требуется лишь описать в composer.json проекта, какие пакеты нужно подключить.

Это пример composer.json проекта:

Это пример composer.json пакета:

В секции require прописана зависимость этого пакета — библиотека guzzle http, необходимая для работы библиотеки getjump/vk. В данном случае, т.е. с точки зрения потребителя пакетов, всевозможные зависимости пакетов — это не наша «забота», с зависимостями composer разберётся сам.

Пространство имён пакета прописано в секции autoload

getjump\\Vk\\ — наименование пространства имён
src/getjump/Vk/ — директория, в которой лежат файлы с классами пакета
Работа с этой библиотекой в проекте:

Core и Friends — это классы библиотеки, которые разложены и прописаны в папке src в соответствии со стандартом PSR-4. Опять же формирование структуры пакета — это работа создателя пакета.
Нам, как потребителю пакета, достаточно прописать в наш проект
include ‘../vendor/autoload.php’;
и все эти классы и пространства имён будут отлично работать.
При этом нам не нужно заморачиваться и писать автозагрузчик. Composer это сделает сам при выполнении команды install.

Установка

Установка Composer глобально

1) Для начала нужно что бы путь к директории с интерпретатором PHP был прописан в переменной окружения path.
Проверим, так ли это:
php –version

Если вывод получился типа такого, то этот шаг можно пропустить
На примере Windows 7
Система -> Дополнительные параметры системы -> Дополнительно -> Переменные среды

Далее нас будет интересовать переменная path:

Вписываем путь к интерпретатору

*С давних времён у меня на компьютере лежит сборка xampp, сама сборка здесь нафиг не нужна, а вот интерпретатор с неё вполне подойдёт (версия PHP – 5.6).

2) Перезапускаем терминал.
Создаём директорию и ставим composer (я ставил на диск D)
D:
cd /
mkdir bin
cd bin
php -r «readfile(‘https://getcomposer.org/installer’);» | php
echo php «%~dp0composer.phar» %*>composer.bat

3) Добавим в переменную окружения path путь к composer.bat, например для D:\bin должно получиться:

Дополнительно можно добавить в path
D:\Users\%userName%\AppData\Roaming\Composer\vendor\bin\
для того, что-бы было удобнее использовать инструменты, глобально установленные через Composer.
(У меня папка Users располагается на диске D, а на C создан симлинк на неё).
Всё, composer установлен и полностью готов к работе.

Ещё: при установке можно словить ошибку
[RuntimeException]
The APPDATA or COMPOSER_HOME environment variable must be set for composer to run correctly
Решение нашлось здесь github.com/composer/composer/issues/2033
Добавляем переменную APPDATA со значением D:\Users\GSU\AppData\Roaming

Установка Composer локально

Есть вариант ещё поставить composer локально, но в большинстве случаев в этом нет явной необходимости.
Однако тут установка ещё проще.
Т.к. программа глобально не установлена, нужен загрузочный файл(мини-программа composer), для его загрузки пишем команду:
php -r «readfile(‘https://getcomposer.org/installer’);» | php
теперь в директории проекта появился файл composer.phar
Всё, можно использовать.
php composer.phar require [название пакета]

Отличия глобальной и локальной установки

Команды запускаются по разному при локальной и глобальной установках:

Например:
Локально: php composer.phar require silex/silex ~1.1
Глобально: composer require silex/silex ~1.1

При локальной установке нужно каждый раз скачивать установочный файл в папку текущего проекта
php -r «readfile(‘https://getcomposer.org/installer’);» | php

При глобальной установке этот файл не нужен. Composer запускается при любой текущей директории.

Команды

install — установка пакетов, прописанных в composer.json
update – обновление пакетов
dumpautoload — пересборка автозагрузчика
require somepackage/somepackage:someversion — добавление нового пакета (по умолчанию пакеты ставятся из оф. репозитория). При установке пакет прописывается в composer.json
update —lock — обновление файла блокировки composer.lock
config —global cache-files-maxsize «2048MiB» — пример изменения параметра конфигурации
—profile — добавление этого параметра к любой команде включит показ времени выполнения и объёма использованной памяти
—verbose — подробная инфомация о выполняемой операции
show —installed — список установленных пакетов с описанием каждого
show —platform — сведения о PHP
—dry-run — репетиция выполнения команды. Может добавляться к командам install и update. Эмулирует выполнение команды без её непосредственного выполнения. Необходим для того, чтобы проверить пройдёт ли установка пакетов и зависимостей успешно.
remove — удаление пакета. Точная противоположность require

Синтаксис composer.json

Именование пакетов и варианты описания пакетов

Имя пакета состоит из двух частей разделёных косой чертой: названия поставщика (vendor name) и названия библиотеки.

Если пакет оформлен в соответствии со стандартом PSR-4, но опубликован не на packagist.org, а на github, то вместо версии пакета нужно прописать ветку и репозиторий для этого пакета:

Пример подключения библиотеки, которая лежит на github, но при этом не оформлена по стандарту PSR-4, а представляет из себя обыкновенное нагромождение файлов с классами и функциями.

Pqr/superlib — эта та самая «неправильная» библиотека.

В секции repositories для неё пишем такую конструкцию

Ключевой момент — секция autoload, здесь указываем нужные нам файлы с классами и функциями.
Структура библиотеки:

Соответственно в проекте вызов getCurrentTime() будет выглядеть примерно так:
$timer = new pqr\superlib\TimerClass;
echo $timer->getCurrentTime();

Версионирование

При указании допустимых версий пакетов можно использовать точное соответствие (1.2.3), диапазоны с операторами сравнения (<1.2.3), комбинации этих операторов (>1.2.3 <1.3), “последняя доступная” (1.2.*), символ тильды (~1.2.3) и знак вставки (^1.2.3).
Указание тильды (~1.2.3) будет включать в себя все версии до 1.3 (не включительно), так как в семантическом версионировании это является моментом внедрения новых функциональных возможностей. В данном случае будет получена последняя из стабильных минорных версий. Т.е. будет меняться только последняя цифра — 1.2.5, 1.2.8 и тд.

Указание знака вставки (^1.2.3) буквально означает “опасаться только критических изменений” и будет включать в себя версии вплоть до 2.0. Применительно к семантическому версионированию, изменение мажорной версии является моментом внесения в проект критических изменений, так что версии 1.3, 1.4 и 1.9 подходят, в то время как 2.0 — уже нет.
Т.е. не меняется только первая цифра.

Тильда: ~1.2.3 — это самый распространённый и безопасный способ указания версии.

Файл composer.lock

Файл composer.lock сохраняет текущий список установленных зависимостей и их версии. Таким образом, на момент, когда версии зависимостей уже будут обновлены (команда update), другие люди, которые будут клонировать ваш проект, получат те же самые версии. Это позволяет убедиться в том, что каждый, кто получает ваш проект, имеет пакетное окружение, идентичное тому, которое вы использовали при разработке, и помогает избежать ошибок, которые могли бы возникнуть из-за обновления версий.

При каждом выполнении команды update версии обновлённый пакетов прописываются в composer.lock. Этот файл загоняется под систему контроля версий и при установке пакетов на новом сервере поставятся именно те версии пакетов, которые прописаны в этом файле. При выполнении команды install composer будет в первую очередь опираться на composer.lock. Таким образом на разных серверах будет гарантированно установлено одинаковое пакетное окружение с точки зрения версий.

Также, файл composer.lock содержит хэш файла composer.json.
И если json файл был отредактирован, то composer выдаст предупреждение, что файл lock не соответствует json файлу.

В таком случае, нужно выполнить команду composer update —lock, которая обновит composer.lock.

Отличие install от update в контексте использования composer.lock

Команда composer install делает следующее:

Проверяет существует ли composer.lock:

— если нет, резолвит зависимости и создаёт его
— если composer.lock существует, устанавливает версии, указанные в нём

Команда composer update:

— Проверяет composer.json
— Определяет последние версии на основе указанных в этом файле
— Устанавливает последние версии
— Обновляет composer.lock в соответствии с установленными

Пример использования с точки зрения создателя проекта

Имеется проект без установленных пакетов

Поставили несколько библиотек

У нас сформировался composer.json с информацией о пакетах

Мы можем его дополнить и распространять проект с этим файлом

Другой пользователь скачал наш проект, выполнил install и у него в проекте развернулись все нужные пакеты

Пример использования с точки зрения создателя пакета

Для примера я создал класс с методом, который будет выводить URL текущей страницы

Класс оформлен как пакет и залит на github.

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

Всё, пакет добавлен

Проверяю работоспособность пакета

Пакет поставился, вот наш класс:

Composer и PhpStorm

Конфигурирование возможности редактирования Composer пакетов

Если опция выставлена, то нельзя будет так просто взять и отредактировать файлы внутри vendor/*/*

Нюансы, тонкости, сложные ситуации

Ошибка: Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them. Nothing to install or update
Решение: composer update —lock

Долго выполняется update при большом числе установленных библиотек
Composer проверяет все зависимости пакетов, а если пакетов много — то это надолго.
Решение: если нужно обновить только одну библиотеку, то указываем её явно:

composer update package/name

Ещё можно добавлять параметр «—prefer-dist» (хотя, по идее, он должен быть включён по умолчанию), тогда composer будет стараться ставить библиотеку из zip-архива, а не клонировать репозиторий.

The «****.json» file could not be downloaded: failed to open stream: HTTP request failed!
Composer пытается дергануть пакет по HTTP, хотя нужно по HTTPS
Решение: composer config —global repo.packagist composer packagist.org

The package is not available in a stable-enough version according to your minimum-stability setting
see for more details.
Стабильной версии у пакета нет, а установка dev версии не разрешена в конфиге.
Решение: либо выставить параметр «minimum-stability»: «dev» и «prefer-stable»: true, чтобы ставить по возможности стабильные версии, либо — если это ваш собственный пакет — создать тег с версией (стикер stable в readme на github должен показывать версию)

История развития и ключевые изменения

— первый релиз состоялся 1 марта 2012 и весь 2012 инструмент активно развивается
— январь 2014 — реализована автозагрузка на основе PSR-4
— март 2016 — вышла в свет бета-версия (1.0.0-beta1). Добавлены команды show —tree для отображения установленных пакетов в виде дерева, why-not — показывает почему нельзя уставить пакет, update —interactive — позволяет выбрать какие пакеты обновлять, а также множество других улучшений и исправлений.
— 4 апрель 2016 — был представлен первый стабильный релиз Composer — 1.0.0

Декабрь 2014 — один из ключевых коммитов в репозиторий composer
github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799
Суть изменения — отключён сборщик мусора

Ссылки

Офсайт: getcomposer.org
Официальный репозиторий пакетов: packagist.org
Репозиторий composer: github.com/composer/composer
Отличный большой туториал по использованию Composer: daylerees.com/composer-primer
Список команд и подробный пример файла composer.json: composer.json.jolicode.com

Composer часть 1. Зачем его использовать в PHP проектах и как с ним работать?

Денис Розганяев

Composer часть 1. Зачем его использовать в PHP проектах и как с ним работать?

Software Engineer в Mobilunity, Преподаватель Компьютерной школы Hillel.

  1. 1. Как установить Composer
  2. 2. Установка — Linux/Unix/macOS
  3. 3. Установка — Windows
  4. 4. Синтаксис и опции Composer
  5. 5. Установка проекта на основе пакета
  6. 6. Установка пакетов
  7. 7. Обновление пакетов
  8. 8. Удаление пакетов
  9. 9. Сброс автозагрузки
  10. 10. Выводы

Язык программирования PHP стремительно развивается с каждым годом. Каждый месяц регистрируют десятки, а то и сотни библиотек для работы с PHP проектами. На сайте packagist указано, что с 2012 года было зарегистрировано более 330 тысяч библиотек. Буквально несколько запущенных команд в терминале — и любая из этих библиотек уже подключена к вашему проекту.

Звучит заманчиво, правда? И всё же, как это реализовать?

Именно Composer поможет справиться вам с такой задачей!

Composer PHP что это и как с ним работать?

Итак, Composer — менеджер пакетов для PHP. Этот инструмент позволяет не только устанавливать сторонние пакеты, но и обновлять их при выходе более новых версий. Также с помощью Composer можно легко создавать пакеты для своих библиотек.

Как установить Composer на хостинг

Composer можно установить локально, в директории проекта, или глобально. Установив Composer глобально, его можно использовать в любом проекте.

Подробную инструкцию по скачиванию инсталлятора можно прочитать по этой ссылке. После скачивания файла установки можем приступить к установке Composer.

Установка — Linux/Unix/macOS

Локально

После правильной загрузки и установки инсталлятора в директории проекта появится файл ‘composer.phar’.

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

php composer.phar
Глобально

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

mv composer.phar /usr/local/bin/composer

Теперь запустите composer, чтобы запустить менеджер пакетов вместо php composer.phar.

Установка — Windows

Для того, чтобы установить Composer глобально для ОС Windows, надо выполнить следующие шаги:

Создайте новый composer.bat файл рядом с composer.phar:

C:\bin> echo @php "%~dp0composer.phar" %*>composer.bat
PS C:\bin> Set-Content composer.bat '@php "%~dp0composer.phar" %*'

Добавьте каталог в переменную среды PATH, если это еще не сделано. Для получения информации об изменении переменной PATH, смотрите эту статью.

Закройте текущий терминал. В новом окне терминала введите следующую команду для проверки работы Composer:

C:\Users\username>composer -V Composer version 2.0.12 2021-04-01 10:14:59

Синтаксис и опции Composer

Первое, что необходимо сказать, Composer — это консольная утилита, у неё нет графического интерфейса, однако это не делает её хуже. Её синтаксис довольно прост, а посмотреть все опции и команды можно введя команду ‘composer’ в терминале. Список всех опций и команд можно рассмотреть ниже:

  • -h — вывести справку по утилите
  • -q — сокращённый вариант вывода
  • -V — показать версию утилиты
  • -n — не задавать интерактивные вопросы
  • -v, -vv,-vvv — настройка подробности вывода
  • -d — использовать указанную рабочую директорию

Список часто используемых команд:

  • archive — архивирует текущий проект в качестве библиотеки для отправки в сеть
  • check-platform-reqs — проверяет, соблюдены ли системные требования
  • create-project — создаёт проект на основе пакета в указанную директорию
  • depends — выводит зависимости пакета
  • dump-autoload — обновляет систему автозагрузки классов
  • exec — позволяет выполнять скрипты из установленных пакетов
  • init — создаёт пустой проект в текущей папке
  • list — выводит список доступных команд
  • outdated — выводит список пакетов, для которых есть обновления
  • prohibits — выводит названия пакетов, которые мешают установить указанный пакет
  • search — поиск пакетов в репозиториях
  • self-update — обновление Composer до последней версии, работает только при локальной установке
  • show — информация о пакете
  • update — обновляет все пакеты до самой актуальной версии

Установка проекта на основе пакета

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

Для этого используйте команду create-project, например:

composer create-project laravel/laravel app_dir
  • composer — обращение к утилите
  • create-project — команда
  • laravel/laravel — пакет фреймворка laravel
  • app_dir — директория, в которую Composer распакует указанный пакет

Установка пакетов

Чтобы установить пакет с помощью Composer, необходимо использовать команду require. Утилита установит указанный вами пакет и запишет его в файл composer.json.

Например, установим пакет для удобного вывода переменных:

composer require larapack/dd

Также можно указать опцию —dev перед написанием названия пакета, чтобы пакет был обязателен, но использовался только в разработке.

Все доступные пакеты можно просмотреть на сервисе Packagist.

Обновление пакетов

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

Для обновления всех пакетов достаточно ввести команду update:

composer update
composer update –dev

Удаление пакетов

Для удаления пакета необходимо ввести команду remove и указать нужный пакет, также можно добавить опцию –dev, если это пакет для разработчиков.

composer remove larapack/dd

Также можно убрать ненужные пакеты в файле composer.json и запустить команду на обновление.

Сброс автозагрузки

Composer из коробки может выступать в роли автозагрузчика классов. Он использует стандарт PSR-4. Иногда случается, что классы закешировались, и новый класс не виден в проекте.

В таких случаях необходимо выполнить команду сброса:

composer dump-autoload
composer du

Выводы

Composer — это достаточно мощная утилита для того, чтобы сделать вашу работу с проектом комфортной. С её помощью вы легко сможете добавлять, обновлять и удалять необходимые вам пакеты. Также приятным бонусом является то, что утилита предоставляет автозагрузчик классов из коробки.

В следующей статье мы поговорим с вами об создании собственного пакета с помощью Composer и о том, как его добавлять на сервис packagist.

Рекомендуем публикацию по теме

Publication thumb

  • Composer часть 2. Создание собственной библиотеки. Загрузка на Packagist читать 10 мин

Денис Розганяев

Software Engineer в Mobilunity, Преподаватель Компьютерной школы Hillel.

Автозагрузка — PHP: Настройка окружения

Любой код на PHP, написанный в современном стиле, вызывается с указанием пространства имён. Не важно, о каком коде идёт речь, будь то вызов кода из файла, лежащего в соседней директории, или вызов кода из установленной зависимости. Это касается любой библиотеки, включая те, которые пишем мы сами. По этой причине нужно как-то выбрать имя пространства имён. Имя пакета отображается в имени пространства имён таким образом — Dependency\Injection , где дефис заменяется на \ (обратный слеш), а каждое слово начинается с заглавной буквы.

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

  • Пакет именуется в «шашлычной нотации» (kebab-case).
  • Каждый пакет может выставлять наружу только одно пространство имён, что снижает риск пересечения с другими пакетами, а также позволяет легко определить принадлежность пространства имён к пакету. В терминологии стандарта PSR-4, такое пространство имён называется «vendor namespace».
  • Пространства имён именуются в стиле StudlyCaps и напрямую отображаются на файловую систему. Исключением является корневое пространство имён, которое получается путём трансформации имени пакета.
  • Исходный код проекта находится в папке src, а тесты в директории tests.

Что касается именования файлов, то, что бы ни хранилось внутри, придерживайтесь именования в стиле StudlyCaps (например, MySuperFile.php ).

Автозагрузка

В предыдущем уроке мы создали файл src/Runner.php, но попытка запустить функции, которые он содержит, например, подключив соответствующий неймспейс в файл index.php завершится с ошибкой. Дело в том, что попытка использовать любой сторонний код, включая другие файлы, принадлежащие текущему пакету, требует загрузки этих файлов. Указание пространства имён, само по себе, никак не влияет на их загрузку. По умолчанию считается, что если вы пытаетесь использовать какой-то код, то он уже загружен, используя require или require_once . Чисто технически можно так и делать. Каждый раз, когда нам нужно использовать сторонний код, мы можем сначала делать его подгрузку через require . К счастью, этого делать не нужно. Более того, линтер ругается на попытку использовать require самостоятельно.

Дело в том, что Composer умеет автоматически загружать все необходимые файлы. Эта функциональность частично опирается на возможности автозагрузки самого PHP. Мы ещё не проходили классы, но стандарт PSR-4 описывает автозагрузку именно классов. Грубо говоря, если правильно сконфигурировать автозагрузчик, то при добавлении нового файла с классом, тот будет загружен автоматически. В случае с файлами, в которых есть только пространство имён и функции, всё чуть сложнее. Каждый новый файл должен быть прописан внутри composer.json , только тогда он будет загружен. Вот как это выглядит:

 "name": "hexlet/pairs", "autoload":  "files": [ "src/Pairs.php", "src/Lists.php" ] > > 

В файл composer.json добавляется секция autoload . Внутрь этой секции добавляется ещё одна секция files . Она в свою очередь содержит список файлов, которые надо загрузить. После обновления секции autoload нужно обязательно запускать команду composer dump-autoload . Она генерирует необходимый код в директории vendor , реализующий указанную загрузку. Затем остаётся только один шаг. Чтобы ваш код начал использовать всё, что сделал Composer, необходимо в начале вашего кода прописать следующую строку:

 require_once __DIR__ . '/../vendor/autoload.php'; 

Конкретный путь зависит от того, где находится директория vendor . При работе с локальным проектом Composer по умолчанию создаст директорию vendor в его корне. Но в случае глобальной установки пакета путь к директории vendor будет другим. Его можно узнать, выполнив команду в терминале:

# Changed current directory to /home/user/.config/composer # vendor 

После установки сам пакет, его зависимости и файл autoload.php будут созданы именно в этой директории. И путь, который мы указали выше, уже не сработает, так как при глобальной установке путь к директории vendor отличается. Поэтому, чтобы файл autoload.php был найден в любом случае, используют следующую запись:

 // Путь который будет использован при глобальной установке пакета $autoloadPath1 = __DIR__ . '/../../../autoload.php'; // Путь для локальной работы с проектом $autoloadPath2 = __DIR__ . '/../vendor/autoload.php'; if (file_exists($autoloadPath1))  require_once $autoloadPath1; > else  

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *