Загрузка и использование класса PHP без пространства имен и без использования «use» - PullRequest
0 голосов
/ 07 октября 2019

Можно ли создать пакет для класса без пространства имен и создать его экземпляр в моих сценариях без использования языковой конструкции use?

например:

<?php
require_once 'vendor/autoload.php';
// use \Something_MyClass; (I don't want to use this 'use')
$mc = new MyClass();     // instead of $mc = new Something\MyClass()
?>

Копия моего комментария ниже, просто чтобы уточнить:

"Это потому, что я все еще использую php 5.2. По устаревшим причинам я не могу обновить php до 5.3 или выше. Я не могуиспользовать пространство имен, но я хочу использовать composer для автозагрузки и управления зависимостями. "

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Это невозможно.

Даже если вы зарегистрируетесь с spl_autoload_register функцией, которая после new MyClass() будет включать файл с class Something_MyClass, эта же строка потерпит неудачу, потому что вы пытаетесьсоздать экземпляр класса, который не существует.

Ваш лучший способ действий - обновить PHP до 5.3 (хотя самая низкая поддерживаемая версия на данный момент - 7.1, и я настоятельно рекомендую туда). Конечно, вы можете создать свой собственный менеджер пакетов (как предложил YvesLeBorg в комментариях), но это позволит вам еще глубже унаследовать и усложнить поддержку и обновление PHP в будущем, не говоря уже о потенциальных ошибках и дополнительныхнакладные расходы на техническое обслуживание.

1 голос
/ 14 октября 2019

Вы можете прекрасно использовать синтаксис PHP 5.2 в своем исходном коде и комбинировать его с Composer, даже с автозагрузкой Composer PSR-0. Composer не применяет никаких правил, касающихся версии PHP.

Единственное, что вы не можете обойти, - это то, что сам Composer требует PHP 5.3.2 для запуска. Но все остальное зависит от вас.

Более подробно, единственный вариант для «классов с пространством имен» в PHP 5.2 - это использовать теперь страшный вариант Under_Score_Class_Name, который может быть автоматически загружен с PSR-0. Вам всегда нужно будет использовать полное имя класса (use, а правильные пространства имен позволят вам использовать более короткие имена). Этот пример имени класса должен находиться по пути /Under/Score/Class/Name.php и будет автоматически загружен с "autoload": {"psr-0": {"Under": "/"}}. У вас нет возможности сократить этот путь с помощью PSR-0 (одна из причин, по которой PSR-4 был изобретен), он всегда должен содержать каждое слово между подчеркиваниями в качестве уровня папки, начиная с первого слова. Единственное, что вы можете изменить, это то, что Composer не требует использования папки в главном каталоге библиотеки. Вы можете использовать путь src/Under/Score/Class/Name.php и выполнить автозагрузку с "psr-0": {"Under_": "src/"}.

Запуск Composer с версией PHP 5.3.2 или выше, вероятно, сводится к а) его установке, а затем б) явному указанию на эту версию, когдазапуск Composer, например /usr/local/bin/php7.2.23/php composer.phar install.

. Если вы не хотите использовать длинные пути, допускается просто использовать имена классов в корневом пространстве имен - обратите внимание, однако, что они не должны дублировать существующие имена классов из самого PHP,Без префикса общего имени класса, такого как Under_ из приведенного выше примера, ваша автозагрузка может быть "psr-0": {"": "src/"}. Однако обратите внимание, что это говорит автозагрузчику Composer, что каждый класс может быть найден в вашей библиотеке. Composer будет отслеживать, где он что-то нашел, и больше не будет пытаться повторить это, но это все равно повлияет на производительность. Поэтому лучше использовать общий префикс.

...