Несколько классов в одном файле php
Несколько классов в одном файле php
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Несколько пространств имён также можно описать в одном файле с помощью двух допустимых синтаксических конструкций.
Пример #1 Описание нескольких пространств имён, простой синтаксис
Данный синтаксис не рекомендуется для комбинирования пространств имён в одном файле. Вместо этого рекомендуется использовать альтернативный синтаксис со скобками.
Пример #2 Описание нескольких пространств имён, синтаксис со скобками
Настоятельно не рекомендуется при программировании комбинировать несколько пространств имён в один файл. Основным применением этому может быть объединение нескольких PHP-файлов в один файл.
Для объединения кода в глобальном пространстве имён с кодом в других пространствах имён, используется только синтаксис со скобками. Глобальный код должен быть помещён в конструкцию описания пространства имён без указания имени:
Пример #3 Описание глобального и обычного пространства имён в одном файле
namespace < // глобальный код
session_start ();
$a = MyProject \ connect ();
echo MyProject \ Connection :: start ();
>
?>
PHP-код не может находиться вне скобок конструкции пространства имён, кроме начального выражения declare.
Пример #4 Описание глобального и обычного пространства имён в одном файле
declare( encoding = ‘UTF-8’ );
namespace MyProject <
namespace < // глобальный код
session_start ();
$a = MyProject \ connect ();
echo MyProject \ Connection :: start ();
>
?>
User Contributed Notes 6 notes
echo «I belong to namespace a» ;
namespace b <
echo «I’m from namespace b» ;
>
//Namespace can be used in this way also
namespace MyProject <
function connect () < echo "ONE" ; >
Sub \ Level \ connect ();
>
namespace MyProject \ Sub <
function connect () < echo "TWO" ; >
Level \ connect ();
>
namespace MyProject \ Sub \ Level <
function connect () < echo "THREE" ; >
\ MyProject \ Sub \ Level \ connect (); // OR we can use this as below
connect ();
>
//call same named function using namespace
require ( ‘Apple.php’ );
require( ‘Orange.php’ );
use Apples ;
use Oranges ;
Apples \ eat ();
Oranges \ eat ();
?>
//Apple.php
namespace Apples ;
function eat ()
<
echo «eat apple» ;
>
?>
//Orange.php
namespace Oranges ;
There are rational examples of where the ability to blend multiple namespaces into a single file is not only desirable but also absolutely necessary. An example of where this ability is useful is over in the very popular phpseclib library where they are PSR-4 compliant but, in order to be compliant, they have to read a directory of files to know what classes are available so that the autoloader can load the correct files. If they, instead, just bundled the defaults into one file using this mechanism already supported by PHP core, there would be no need to do extraneous scanning of the file system.
That’s just one legitimate use-case where strict compliance with PSRs gets in the way of good software development.
Можно ли использовать несколько классов в одном пространстве имен, в одном файле
Можно ли использовать несколько классов в одном пространстве имен в одном файле? Я хочу сделать что-то вроде этого:
чтобы избежать использования одного файла для каждого класса исключений.
Проблема в том, что когда я пытаюсь использовать в другом классе одно из пользовательских исключений,
класс CustomException1 не найден. Есть идеи?
Решение
Я не думаю, что есть что-то синтаксически неправильно с этим, но я не думаю, что PSR-4 совместимые auotloaders смогут найти класс, которого нет в его собственном выделенном файле, поскольку стандарт состоит в том, что имя файла, к которому принадлежит класс, совпадает с именем самого класса:
Из-за этого, если вы хотите использовать этот подход, вы должны обеспечить include этот файл классов вручную всякий раз, когда вам нужно будет определить эти классы (в основном, каждый раз, когда вы хотите выбросить / перехватить любое из этих исключений).
Альтернативой является определение классов, которые вы хотите, внутри файла другого класса, которым вы являетесь абсолютно уверен всегда будет автоматически загружаться до любого вызова любого new CustomExceptionN заявления. Вы, вероятно, обнаружите, что в большинстве случаев гораздо больше проблем с запоминанием, чтобы сначала быть уверенным в автозагрузке. Class1 Перед использованием Class2 чем просто следовать стандарту и включать каждый класс в свой собственный файл, расположенный по правильному пути к пространству имен.
Несколько PHP-классов в одном файле
У меня есть несколько классов PHP с примерно 20 функциями каждый в одном файле PHP. Будет ли сервер хранить каждый класс и каждую функцию в памяти после включения этого файла?
Или он будет загружать только класс и его функции после создания экземпляра так?:
Или сервер будет кэшировать только те функции, которые я специально вызываю?:
Мне интересно, нормально ли иметь так много классов и функций, размещенных в одном файле PHP, или если я должен использовать логику определенного типа, которая включает только классы и функции, необходимые для работы.
Нет, сервер по умолчанию не будет кэшировать что-либо, если он не настроен на кеширование с использованием APC или подобных расширений. Поэтому, если ваш код использует все эти классы, возможно, было бы лучше поместить их в один файл для уменьшения ввода-вывода. Но если вы не используете, отделите код на логические классы, поместите в отдельный файл и используйте автозагрузку.
Я думаю, вы немного смущены тем, как работает PHP.
Каждый запрос парсера PHP анализирует запрошенный файл, например index.php
Если index.php include другой файл, PHP будет разбирать этот файл.
После анализа файла PHP он хранится в памяти с «байтовыми кодами» (почти машинным языком) во время этого запроса.
Независимо от того, сколько функций или классов находится в файле, все это будет храниться в памяти для этого запроса.
Существуют расширения, такие как APC, которые кэшируют эти проанализированные байтовые коды в памяти между запросами, но их нужно добавить к PHP.
Однако лучше (с точки зрения использования памяти) использовать автоматическую загрузку для своих классов.
Два класса в один
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Вложения
mysqli.class.zip (4.7 Кб, 1 просмотров) |
Объединить два класса в один
Здравствуйте! Допустим, есть два класса с 50 одинаковыми свойствами, но во втором классе.
Объединить в один проект два класса
Нужно объединить в один проект два класса. Я добавил дополнительный класс со всем кодом, но.
в конструкторе не создана переменная, надо вызвать
Решение
и возвращайте тогда его
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Один на один, или как привязать два пересекающихся объекта друг к другу?
Здравствуйте! Сразу к делу: чтобы было понятно, представьте себе дорогу(трассу, с видом сверху).
Два компа, два отдельных интернета один роутер
Здравствуйте, у меня вопрос по теме, имею два компа и две линии интернета(оптика), роутер Tp-Link.
Как заставить ereg_replace менять два стоящих подряд обратных слэша или один прямой на один обратный?
Как заставить ereg_replace менять два стоящих подряд обратных слэша или один прямой на один.
PHP: Может ли AutoLoader загружать несколько классов в один файл php?
В PHP 5 в этом больше нет необходимости. Функция spl_autoload_register () регистрирует любое количество автозагрузчиков, позволяя автоматически загружать классы и интерфейсы, если они в настоящее время не определены. Регистрируя автозагрузчики, PHP получает последний шанс загрузить класс или интерфейс, прежде чем он выйдет из строя с ошибкой.
Например, у меня есть файл протокола в Protobuf \ Client.php:
4 ответа
Ваш автозагрузчик заменит символы подчеркивания и загрузит:
Для меня это простой способ сделать это, но я предпочитаю использовать пространство имен и класс. Вышеупомянутый метод в настоящее время не пользуется популярностью, и с точки зрения именования его очень легко перепутать, поскольку множество классов может находиться в одной и той же папке или быть вложенными очень глубоко в подпапки. Вы можете получить очень длинные названия для классов.
Чтобы напрямую ответить на этот вопрос, мы можем использовать classmap вместо autoload в composer.json для поддержки одного файла, содержащего несколько классов.
Мы добавляем classmap в composer.json следующим образом:
Затем в main.php мы можем использовать классы A и B :
Для людей, еще не знакомых с композитором, вот окончательная структура файлов, которую мы получим:
Да и нет, но что, если я создам (автоматически) классы и методы для очень большого WSDL?
Т.е. для более чем сотни методов у вас будет, вероятно, сотня methodRequests (как объект класса), следующая сотня methodResponse (как объект класса) и большие массивы, например ClassMap.
Иногда лучше обрабатывать все это в одном файле, особенно при разработке без хороших собак для WSDL.
Чтобы распространить очень информативный ответ на Rasclatts,
В идеале, когда дело доходит до автозагрузки, всегда рекомендуется разделять классы. Я настоятельно рекомендую изучить автозагрузку пространства имен композиторов PSR-0.
PSR-0 Позволяет вам красиво организовать все ваши классы в подпапки с бесконечной глубиной, возьмите следующую структуру папок
В этом примере в каждом из приведенных выше файлов php у вас будет namespace MyNameSpace; перед объявлением класса, а затем в вашем composer.json у вас будет что-то похожее на (документация):
Composer должен быть установлен на вашем локальном / главном компьютере, чтобы вы могли скомпилировать файлы автозагрузки, открыть терминал, перейти в каталог проекта и ввести:
Теперь все аккуратно организовано, и вы можете получить доступ к своим классам примерно так: