«Скрытые» возможности PHP 04.07.2010
Сегодня я проявлю себя в роли Капитана Очевидности и расскажу про некоторые «скрытые» возможности php. Эта статья вольный перевод ветки . Итак, поехали:
Документация PHP
Что в ней такого? А вы попробуйте набрать в адресной строке http://php.net/%function_name%, например . Даже если функции не существует, вас просто перебросит на страницу поиска. Удобно, правда?
Массивы
Массивы в php очень удобны для работы, в них нет разграничения на ассоциативные и нет, как например в python или perl, к тому же нам дают большое количество для работы с ними, которые показывают отличную производительность по сравнению с аналогами на php.
Обработчики потоков (stream handler)
Прелесть этого пункта показана в статье Быстрое создание Excel таблиц в PHP
Магические методы
Это такие методы класса, которые будут вызваны вместо несуществующего метода, свойства.
-
-
class X {
-
public function __get($fieldName) { ... }
-
public function __set($fieldName, $value) { ... }
-
public function __call($funcName, $args) { ... }
-
public function __toString() { ... }
-
}
-
Полный список таких функций можно найти на странице
«Переменные» переменные и функции
В PHP есть возможно обращения по имени переменной записанной в другую переменную. Не понятно? Пример:
-
-
$foo = 'bar';
-
$bar = 'foobar';
-
$$foo; //This outputs foobar
-
-
function bar() {
-
'Hello world!';
-
}
-
-
function foobar() {
-
'What a wonderful world!';
-
}
-
$foo(); //This outputs Hello world!
-
$$foo(); //This outputs What a wonderful world!
-
Хотя за использование такого в серьезных проектах я бы отрывал руки =)
Оптимизация обработки условий
Не секрет, что интерпретаторы и компиляторы оптимизируют условия, для увеличения производительности, так к примеру в выражениях:
-
-
if ( false && someFunc() ){}
-
if ( true || someFunc() ){}
-
функция someFunc не будет вызвана. Это можно использовать в своих коварных целях:
-
-
// Даже если такого ключа не существует, ошибки не возникнет, так как обращения не произойдет
-
if ( ($Arr['key']) && $Arr['key'] > 15 ){}
-
-
// Если соединение установится, функция вернет true, и второе условие не выполниться
-
(...)
-
or throw new Exception('Connect failed');
-
-
// Также удобно в шаблонизаторах писать конструкции вида
-
$flag and '$flag is true'; // Работает только с print, не используйте echo
-
не стоит забывать, что все это ухудшает читаемость кода, так что не злоупотребляйте.
__autoload
Замечательно нововведение PHP5 это . Пользоваться этим просто:
-
-
function __autoload($class_name) {
-
require_once $class_name . '.php';
-
}
-
strtr
Это из по работе со строками в php. Она позволяет делать замены в строке, быстро. Очень быстро. На самом это одна из самых быстрых функций по работе со строками. Следующий раз, когда вы захотите использовать str_replace или регулярные выражения вспомните о ней.
Extract и Compact
распаковывает массив в текущее символьное пространство, создавая локальные переменные, а наоборот запаковывает.
-
-
$Arr = ("var" => "Hello world");
-
($Arr);
-
-
$var; // Hello world
-
$Arr2 = ('var'); // array("var" => "Hello world")
-
include
Функции include и include_once могу возвращать переменные, так к примеру
-
-
// config.php
-
return (
-
'db' => (
-
'host' => 'example.org',
-
'user' => 'usr',
-
// ...
-
),
-
// ...
-
);
-
-
// index.php
-
$config = include 'config.php';
-
$config['db']['host']; // example.org
-
можно организовывать загрузку конфигурации
Статические переменные
В PHP статические переменные могут объявлять не только в классах, но и в функциях. Так к примеру можно организовывать локальный кеш.
-
-
function foo($arg1)
-
{
-
$cache;
-
-
if( !($cache[($arg1)]) )
-
{
-
// Do the work here
-
$cache[($arg1)] = $results;
-
}
-
-
return $cache[($arg1)];
-
}
-
HEREDOC
Для записи больших по объему строк, в PHP можно делать так:
-
-
<<<EOM
-
<div id="someblock">
-
<img src="{$file}" />
-
</div>
-
EOM; //Этой строке не должны предшествовать другие символы, включая пробелы
-
Альтернативный способ доступа к свойствам объекта
К некоторым свойствам объекта не возможно обратиться, если в них содержаться недопустимые символы (например точка или тире), в этих случаях можно сделать так:
-
-
$this->{'background-color'} = "#000000";
-
«Ленивые» комментарии
Это легче увидеть, я думаю вы поймете, когда они буду полезны
-
-
//*
-
('not commented');
-
//*/
-
-
-
/*
-
die('commented');
-
//*/
-
Range
-
-
for ($i=0; $i < 10; $i++) {}
-
// Эквивалентно
-
foreach ((0, 10) as $i){}
-
stdClass
В php есть стандартный класс stdClass, который наследуют все другие классы. На самом деле он почти бесполезен, но в некоторых случаях его все же можно использовать.
-
-
$Arr = ("foo" => "bar");
-
$Obj = (object) $Arr; // Массив будет преобразован в объект класса stdClass
-
-
$Obj -> foo; // bar
-
// В таком виде удобно использовать в контексте
-
"I see $Obj->foo, is it real?";
-
Заключение
Надеюсь хотя бы на одном из пунктов вы остановились с интересом. А какие забавные возможности я упустил?
Похожие статьи
- Паттерн проектирования Прокси (Proxy) на PHP
- Вышел PHP 5.4a1
- Как закрыть соединение и продолжить выполнение скрипта
- Встроенный Web сервер в PHP
- Вышел NetBeans 7 Beta 2

Просто спасибо :)
— неплохая ссылка по теме..