Возможно ли использовать несколько классов в одном пространстве имен в одном файле


Возможно ли использовать несколько классов в одном пространстве имен в одном файле? Я хочу сделать что-то вроде этого:

<?php
  namespace MyNamespace\Helpers\Exceptions

  use Exception;

  class CustomException1 extends Exception{}

  class CustomException2 extends Exception{}

  class CustomException3 extends Exception{}

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

use MyNamespace\Helpers\Exceptions\CustomException1;

Класс CustomException1 не найден. Есть какие-нибудь идеи?

Author: Gligor Florin, 2015-03-13

1 answers

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

  1. Имя конечного класса соответствует имени файла, заканчивающемуся на .php. Имя файла ДОЛЖНО соответствовать регистру имени завершающего класса.

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

Альтернативой является определение классов, которые вы хотите разместить внутри файла другого класса, в котором вы абсолютно уверены, что всегда будет загружаться автоматически перед любым вызовом любых операторов new CustomExceptionN. Вы, вероятно, найдете в в большинстве случаев гораздо сложнее запомнить, что перед использованием Class1 необходимо сначала выполнить автоматическую загрузку Class2, чем просто следовать стандарту и включать каждый класс в свой собственный файл, расположенный по правильному пути к пространству имен.

 21
Author: Jeff Lambert, 2015-07-27 13:27:28