Pull to refresh

Еще немного интересных возможностей.

Reading time2 min
Views807
Навеяно прошлым топиком.

В 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.
Tags:
Hubs:
+5
Comments20

Articles

Change theme settings