Навеяно прошлым топиком.
В php, как и в любом языке, есть конструкции, которые по той или иной причине не нашли широкого применения, однако знание таких нестандартных приемов иногда может облегчить вам жизнь. Сегодня я расскажу об одной такой возможности. Статья расчитана для начинающих программистов и просто любопытных людей.
Все (я надеюсь) знают замечательную функцию __autoload преимущества которой, оценено теми, кто перешел на php 5. Но и ранее, еще в 4-ке, можно было найти конструкции вида:
Теперь такого уже не встретишь, но ведь возможность осталась. И грех ее не использовать.
А заключается возможность в том, что объявлять классы и функции вы можете внутри других конструкций языка.
Далее идут примеры про функции, но все нижеперечисленное справедливо и для классов.
Рассмотрим один пример. У вас есть функция, логика которой зависит от какого-то сложного условия, которое не изменяется (!) в процессе работы скрипта. Например логика зависит от выборки из базы. Классическое решение выглядит так:
Нам пришлось вводить дополнительную константу, а умненькие буратины знают, что плодить сущности — зло. Однако, зная о возможности оборачивать объявления в конструкции, можно переписать этот код следующим образом:
Согласитесь, приятней выглядит? :)
Идея на этом заканчивается и начинается фантазия. Каждый может пофантазировать сам:) Я же предложу еще один пример, который использует то, что в php однажды объявленная функция становится глобально доступной.
Пример:
Нетрудно догадаться, что эти три функции могут быть вызваны только в таком порядке. Может быть полезно при всяких там инициализациях и пр.
Еще раз оговорюсь, эти конструкции являются скорее экзотическими и, возможно, вам никогда не придется использовать их на практике, но знать о таких возможностях языка все же надо. Хотя бы для общего развития ;)
PS: Весь код любезно подсветил Source Code Highlighter.
В php, как и в любом языке, есть конструкции, которые по той или иной причине не нашли широкого применения, однако знание таких нестандартных приемов иногда может облегчить вам жизнь. Сегодня я расскажу об одной такой возможности. Статья расчитана для начинающих программистов и просто любопытных людей.
Все (я надеюсь) знают замечательную функцию __autoload преимущества которой, оценено теми, кто перешел на php 5. Но и ранее, еще в 4-ке, можно было найти конструкции вида:
function init($cname) {
if (!class_exists($cname)) {
require $cname.'.inc.php';
}
}
init('myClass');
$a = new myClass;
Теперь такого уже не встретишь, но ведь возможность осталась. И грех ее не использовать.
А заключается возможность в том, что объявлять классы и функции вы можете внутри других конструкций языка.
Далее идут примеры про функции, но все нижеперечисленное справедливо и для классов.
Рассмотрим один пример. У вас есть функция, логика которой зависит от какого-то сложного условия, которое не изменяется (!) в процессе работы скрипта. Например логика зависит от выборки из базы. Классическое решение выглядит так:
if (/*тяжелое условие*/) {
define('MYCONST', true);
} else {
define('MYCONST', false);
}
function my_func() {
if (MYCONST) {
//code
} else {
//different code
}
}
Нам пришлось вводить дополнительную константу, а умненькие буратины знают, что плодить сущности — зло. Однако, зная о возможности оборачивать объявления в конструкции, можно переписать этот код следующим образом:
if (/*тяжелое условие*/) {
function my_func() {
//code
}
} else {
function my_func() {
//different code
}
}
Согласитесь, приятней выглядит? :)
Идея на этом заканчивается и начинается фантазия. Каждый может пофантазировать сам:) Я же предложу еще один пример, который использует то, что в php однажды объявленная функция становится глобально доступной.
Пример:
function a() {
if (!function_exists('b')) {
function b() {
if (!function_exists('c')) {
function c() {
return «Three»;
}
}
return «Two»;
}
}
return «One»;
}
echo a();
echo b();
echo c();
Нетрудно догадаться, что эти три функции могут быть вызваны только в таком порядке. Может быть полезно при всяких там инициализациях и пр.
Еще раз оговорюсь, эти конструкции являются скорее экзотическими и, возможно, вам никогда не придется использовать их на практике, но знать о таких возможностях языка все же надо. Хотя бы для общего развития ;)
PS: Весь код любезно подсветил Source Code Highlighter.