2016-06-23 6 views
2

Цитата Autoloading Classes:PHP: Есть AutoLoader возможность загружать несколько класса в одном файле PHP

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

В PHP 5 это больше не требуется. Функция spl_autoload_register() регистрирует любое количество автозагрузчиков, позволяя для классов и интерфейсов автоматически загружаться, если они в настоящее время не определены . Регистрируя автозагрузчики, PHP получает последний шанс, чтобы загрузил класс или интерфейс, прежде чем он завершится с ошибкой.

Возникает вопрос: что, если в одном файле php есть несколько классов, подходит ли оно для использования с автозагрузкой? или мне нужно использовать заявление require filepath?

К примеру, у меня есть файл протокола под Protobuf \ Client.php:

<?php 

namespace Protobuf; 
class A { 
... 
} 
class B { 
... 
} 
+1

Для автоматической загрузки этих классов из файла с именем 'Client.php' вам понадобится сложная функция. Идея состоит в том, чтобы перевести ваше пространство имен \ classname в 'каталог \ filename.php' – Rasclatt

+1

. В этом случае вам нужно будет указать ваш файл' A.php', тогда, когда вы вызовете 'new Protobuf \ A()', он найдет его , В противном случае вам придется создать слишком сложный автозагрузчик. – Rasclatt

+1

Наконец, если вы создадите его, чтобы автозагрузчик обнаружил класс 'A', тогда вы можете иметь' B' в том же файле, но только если вы уже загрузили 'A', в противном случае вам нужно сделать некоторые алгоритмы, чтобы знать, что 'A' и' B' находятся на одной странице. – Rasclatt

ответ

2

Вы должны были бы иметь некоторую сложную функцию автозагрузку эти классы из файла с именем Client.php. Идея заключается в том, чтобы перевести ваш namespace\classname в directory\filename.php

В этом случае вам нужно будет назвать файл A.php тогда, когда вы звоните new Protobuf\A() он найдет его. В противном случае вам придется создать слишком сложный автозагрузчик.

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

Я хотел бы сделать выше шаблон или шаблон, принятые приложениями, как Magento, которые превращают имена класса в пути к каталогам с помощью замещающего подчеркивания:

$class = new Core_Classes_MyClass_Client(); 

Автозагрузчик заменит подчеркивание и загрузит:

Core/Classes/MyClass/Client.php //or similar scheme 

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

+0

psr-0 namespacing ftw. – zanderwar

+0

Я могу добавить к этому ответу, что лучший подход состоит в том, чтобы каждый класс был в одном файле, поэтому автозагрузчик (как описано в ответе автора) найдет любой класс, который вы вызываете по соглашению 'namespace \ classname' – matiaslauriti

+0

I ' Очень рад найти такое информативное обсуждение. Спасибо всем, ребята! – lulyon

1

Продлить на Rasclatts очень информативный ответ,

В идеале, это всегда хорошая практика для отдельных классов, когда речь идет о автозагрузке.Я настоятельно рекомендую посмотреть на композитор PSR-0 Пространства имен Автозагрузка

PSR-0 Позволяет красиво организовать все классы в подпапки с бесконечной глубиной, возьмите следующую структуру папок

\system 
- Members 
    - Members.php 
- Auth 
    - Auth.php 
- Database 
    - Database.php 

Для этого примера, в каждый из PHP файлов выше, вы бы namespace MyNameSpace; до вашего объявления класса, а затем в вашем composer.json вы бы что-то подобное (documentation):

"autoload": { 
    "psr-0": { "MyNameSpace": "/system" } 
} 

COMPOS эр должен быть установлен на локальный/хост-компьютера для вас, чтобы скомпилировать автозагрузки файлов, откройте терминал и перейдите в каталог проекта и введите:

composer dump-autoload -o 

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

\MyNameSpace\Auth::staticFunction(); 
1

Да и НЕТ, Но что, если я генерировать (автоматически) классы и методы для очень большого WSDL?

ie. для более чем ста методов. У вас было бы, вероятно, сот методовRequests (как объект класса), следующая сотня методаResponse (как объект класса) и больших массивов, т.е. ClassMap.

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

 Смежные вопросы

  • Нет связанных вопросов^_^