Как разбить класс PHP на отдельные файлы?
Я хочу сделать что-то вроде категорий классов в Objective-C, чтобы определить класс в одном файле, реализовать там некоторые основные методы, а затем реализовать некоторые вспомогательные методы в другом без подкласса или интерфейсов, просто "продолжить" класс.
Возможно в PHP?
Ответы
Ответ 1
a-priori PHP doest не дает вам эту функцию по построению языка, весь класс должен находиться в одном файле.
Теперь есть трюки, которые могли бы сделать что-то, но они требуют особого требования к процессору:
Вы можете, например, отделить свои классы от разных файлов, затем загрузить файлы и построить одну строку с помощью всего кода, а затем выполнить eval (string), чтобы интерпретировать классы и построить их в области исполняемого кода.
не очень хорошая идея по многим причинам
Ответ 2
Как и в случае с PHP 5.4, вы можете выполнить это с помощью Traits. Процитировать официальную документацию:
Признаки [enable] разработчик для повторного использования наборов методов свободно в нескольких независимых классах, живущих в разных иерархиях классов. [...] A Trait похож на класс, но предназначен только для групповой работы в тонкой и последовательной форме. Невозможно создать экземпляр признака самостоятельно. Это дополнение к традиционному наследованию и обеспечивает горизонтальный состав поведения; то есть применение членов класса без необходимости наследования.
Использование признака позволяет хранить вспомогательные методы, которые учитывают сквозные проблемы в центральном месте и использовать эти методы в любых классах, в которых вы нуждаетесь.
// File "HelperMethodTrait.php"
trait HelperMethodTrait
{
public function myIncredibleUsefulHelperFunction()
{
return 42;
}
}
// File "MyClass.php"
class MyClass
{
use HelperMethodTrait;
public function myDomainSpecificFunction()
{
return "foobar";
}
}
$instance = new MyClass();
$instance->myIncredibleUsefulHelperFunction(); // 42
Ответ 3
Если ваша единственная цель - сделать файл определения класса меньше, вы можете включить файлы в определение функции
class MyClass {
public function doStuff($foo,$bar) {
global $quz;
include('MyClass.doStuff.php');
}
}
Внутри include применяется ваша локальная область ($ foo, $bar и $quz будут определены)
Я не уверен, что накладные расходы - включение, кажется, происходит во время выполнения, а не время компиляции (так как включение может фактически вернуть значение.)
$2с,
* -pike
Ответ 4
Я думаю, вам лучше разделить свой класс на n частей по функциональным критериям, а затем использовать шаблон инъекции зависимостей для "введения" класса A в класс B в конструкторе для B без необходимости подкласса/интерфейсов.
Ответ 5
Вы можете использовать этот метод для добавления функций к некоторым объектам извне, что отличается от добавления методов к самому классу.
fooobar.com/questions/76965/...
Ответ 6
Другой не очень-то хороший способ - создать несколько подклассов, чтобы каждый уровень подклассов добавлял только "группу" функций.
Я использовал этот трюк в одном случае, когда класс имел более 10 тыс. строк.
Теперь у меня есть 6 уровней наследования, где каждый уровень добавляет одну "категорию" функций класса "предыдущего уровня".
Не так много процессорных, уродливых, чтобы их было не так сложно поддерживать