Говоря о документации PHP, говорят
Любой допустимый код может отображаться внутри функции, даже другие функции и определения классов.
Существует ли вариант использования определения класса внутри функции? Я видел определения функций внутри функции, особенно анонимные функции, но как насчет классов?
Определение класса внутри функции не будет анализироваться до тех пор, пока эта функция не будет запущена. То же самое относится к любому определению внутри оператора if
. Там используется для определения внутри операторов if
:
if (!function_exists('foo')) {
function foo ..
}
Это полезно для прокладки обратной совместимости и т.д. И расширение этого, чтобы также работать внутри функций, имеет прекрасный смысл, почему бы вам не захотеть инкапсулировать ваш код прокладки в функцию?
Помимо условного объявления классов и функций, для этого нет реального использования. Классы и функции, объявленные таким образом, доступны по всему миру, как и любой другой класс или функция, только их объявление задерживается до вызова функции. Также обратите внимание, что вы вызовете ошибку, если вы вызовете такую функцию дважды (class Foo already defined
), если вы не принимаете меры предосторожности, такие как class_exists
.
Посмотрите на произвольный загрузчик классов (например, Composer ClassLoader::includeFile()
). Я бы сказал, что все они require/include
запрошенный класс в метод, который эффективно определяет класс в этом методе.
Если говорить о методах класса, вы можете теперь, если хотите создать загрузчик классов, который является просто функцией. Также обратите внимание, что загрузчики первого класса в PHP могут быть созданы только с помощью функции __autoload()
.
PHP 7
будет поддерживать анонимные классы, см. Здесь stackoverflow.com/questions/9726396/…