Определение класса внутри функции: есть ли для него применение?

1

Говоря о документации PHP, говорят

Любой допустимый код может отображаться внутри функции, даже другие функции и определения классов.

Существует ли вариант использования определения класса внутри функции? Я видел определения функций внутри функции, особенно анонимные функции, но как насчет классов?

  • 1
    Даже если для этого есть сценарий, это все равно очень плохой дизайн. Руки прочь!
  • 2
    PHP 7 будет поддерживать анонимные классы, см. Здесь stackoverflow.com/questions/9726396/…
Показать ещё 3 комментария
Теги:
class
oop

2 ответа

1
Лучший ответ

Определение класса внутри функции не будет анализироваться до тех пор, пока эта функция не будет запущена. То же самое относится к любому определению внутри оператора if. Там используется для определения внутри операторов if:

if (!function_exists('foo')) {
    function foo ..
}

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

Помимо условного объявления классов и функций, для этого нет реального использования. Классы и функции, объявленные таким образом, доступны по всему миру, как и любой другой класс или функция, только их объявление задерживается до вызова функции. Также обратите внимание, что вы вызовете ошибку, если вы вызовете такую функцию дважды (class Foo already defined), если вы не принимаете меры предосторожности, такие как class_exists.

1

Посмотрите на произвольный загрузчик классов (например, Composer ClassLoader::includeFile()). Я бы сказал, что все они require/include запрошенный класс в метод, который эффективно определяет класс в этом методе.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню