Подтвердить что ты не робот

Как разбить класс PHP на отдельные файлы?

Я хочу сделать что-то вроде категорий классов в Objective-C, чтобы определить класс в одном файле, реализовать там некоторые основные методы, а затем реализовать некоторые вспомогательные методы в другом без подкласса или интерфейсов, просто "продолжить" класс.

Возможно в PHP?

4b9b3361

Ответ 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 уровней наследования, где каждый уровень добавляет одну "категорию" функций класса "предыдущего уровня".

Не так много процессорных, уродливых, чтобы их было не так сложно поддерживать