«Скрытые» возможности PHP 04.07.2010

Сегодня я проявлю себя в роли Капитана Очевидности и расскажу про некоторые «скрытые» возможности php. Эта статья вольный перевод ветки Hidden Features of PHP. Итак, поехали:

Документация PHP

Что в ней такого? А вы попробуйте набрать в адресной строке http://php.net/%function_name%, например array_unique. Даже если функции не существует, вас просто перебросит на страницу поиска. Удобно, правда?

Массивы

Массивы в php очень удобны для работы, в них нет разграничения на ассоциативные и нет, как например в python или perl, к тому же нам дают большое количество готовых функций для работы с ними, которые показывают отличную производительность по сравнению с аналогами на php. 

Обработчики потоков (stream handler)

Прелесть этого пункта показана в статье Быстрое создание Excel таблиц в PHP

Магические методы

Это такие методы класса, которые будут вызваны вместо несуществующего метода, свойства.

  1.  
  2. class{
  3.      public function __get($fieldName) { ... }
  4.      public function __set($fieldName, $value) { ... }
  5.      public function __call($funcName, $args) { ... }
  6.      public function __toString() { ... }
  7. }
  8.  

Полный список таких функций можно найти на странице Magic Methods in PHP

«Переменные» переменные и функции

В PHP есть возможно обращения по имени переменной записанной в другую переменную. Не понятно? Пример:

  1.  
  2. $foo'bar';
  3. $bar'foobar';
  4. echo $$foo;    //This outputs foobar
  5.  
  6. function bar() {
  7.     echo 'Hello world!';
  8. }
  9.  
  10. function foobar() {
  11.     echo 'What a wonderful world!';
  12. }
  13. $foo();    //This outputs Hello world!
  14. $$foo();    //This outputs What a wonderful world!
  15.  

Хотя за использование такого в серьезных проектах я бы отрывал руки =)

Оптимизация обработки условий

Не секрет, что интерпретаторы и компиляторы оптимизируют условия, для увеличения производительности, так к примеру в выражениях:

  1.  
  2. if ( false && someFunc() ){}
  3. if ( true || someFunc() ){}
  4.  

функция someFunc не будет вызвана. Это можно использовать в своих коварных целях:

  1.  
  2. // Даже если такого ключа не существует, ошибки не возникнет, так как обращения не произойдет
  3. if ( isset($Arr['key']) && $Arr['key'] > 15 ){}
  4.  
  5. // Если соединение установится, функция вернет true, и второе условие не выполниться
  6.     or throw new Exception('Connect failed');
  7.  
  8. // Также удобно в шаблонизаторах писать конструкции вида
  9. $flag and print '$flag is true'; // Работает только с print, не используйте echo
  10.  

не стоит забывать, что все это ухудшает читаемость кода, так что не злоупотребляйте.

__autoload

Замечательно нововведение PHP5 это автозагрузка неизвестных классов. Пользоваться этим просто:

  1.  
  2. function __autoload($class_name) {
  3.     require_once $class_name'.php';
  4. }
  5.  

strtr

Это одна из функций по работе со строками в php. Она позволяет делать замены в строке, быстро. Очень быстро. На самом это одна из самых быстрых функций по работе со строками. Следующий раз, когда вы захотите использовать str_replace или регулярные выражения вспомните о ней.

Extract и Compact

Extract распаковывает массив в текущее символьное пространство, создавая локальные переменные, а Compact наоборот запаковывает.

  1.  
  2. $Arr = array("var" => "Hello world");
  3. Extract($Arr);
  4.  
  5. echo $var; // Hello world
  6. $Arr2 = Compact('var'); // array("var" => "Hello world")
  7.  

include

Функции include и include_once могу возвращать переменные, так к примеру

  1.  
  2. // config.php
  3. return array(
  4.     'db' => array(
  5.         'host' => 'example.org',
  6.         'user' => 'usr',
  7.         // ...
  8.     ),
  9.     // ...
  10. );
  11.  
  12. // index.php
  13. $config = include 'config.php';
  14. echo $config['db']['host']; // example.org
  15.  

можно организовывать загрузку конфигурации

Статические переменные

В PHP статические переменные могут объявлять не только в классах, но и в функциях. Так к примеру можно организовывать локальный кеш.

  1.  
  2. function foo($arg1)
  3. {
  4.     static $cache;
  5.  
  6.     if( !isset($cache[md5($arg1)]) )
  7.     {
  8.         // Do the work here
  9.         $cache[md5($arg1)]$results;
  10.     }
  11.  
  12.     return $cache[md5($arg1)];
  13. }
  14.  

HEREDOC

Для записи больших по объему строк, в PHP можно делать так:

  1.  
  2. echo <<<EOM
  3.   <div id="someblock">
  4.     <img src="{$file}" />
  5.   </div>
  6. EOM; //Этой строке не должны предшествовать другие символы, включая пробелы
  7.  

Альтернативный способ доступа к свойствам объекта

К некоторым свойствам объекта не возможно обратиться, если в них содержаться недопустимые символы (например точка или тире), в этих случаях можно сделать так:

  1.  
  2. $this->{'background-color'}"#000000";
  3.  

«Ленивые» комментарии

Это легче увидеть, я думаю вы поймете, когда они буду полезны

  1.  
  2. //*
  3.     die('not commented');
  4. //*/
  5.  
  6.  
  7. /*
  8.     die('commented');
  9. //*/
  10.  

Range

  1.  
  2. for ($i=0; $i < 10; $i++) {}
  3. // Эквивалентно
  4. foreach (range(0, 10) as $i){}
  5.  

stdClass

В php есть стандартный класс stdClass, который наследуют все другие классы. На самом деле он почти бесполезен, но в некоторых случаях его все же можно использовать.

  1.  
  2. $Arr = array("foo" => "bar");
  3. $Obj = (object) $Arr; // Массив будет преобразован в объект класса stdClass
  4.  
  5. echo $Obj -> foo; // bar
  6. // В таком виде удобно использовать в контексте
  7. echo "I see $Obj->foo, is it real?";
  8.  

Заключение

Надеюсь хотя бы на одном из пунктов вы остановились с интересом. А какие забавные возможности я упустил?


,


Похожие статьи


  1. Rallin:

    Просто спасибо :)

  2. sitIg:

    net.tutsplus.com/tutorial...ou-need-to-know/ — неплохая ссылка по теме..

Добавить комментарий