PHPFuck
JSFuck у нас уже был (это намёк на язык Брейнфак, а не ругательство), почему бы не изобрести PHPFuck?
Часа полтора потратил на скрипт, который выводит слово «Hello!»:
<?
$__=$_[$_[]++].=$_;$_[!_]+=++$_[!_];@$$_=($_[$$_][$_]&$_[$$_][$_[!_]]).$_[$$_][$_];
$_[]=&$$_;@$$_.=$_[!!_][$__]^$__[$_[!_]]|$__[!_];$___=$__[!_]|_&~$__[!!_];
@$$_.=++$___.($__[$_]^_^$__[$_[!_]]).($_[!!_][!$_]^$_[_==_][$_[!_]>>!!_]^_);
$___&=$__[$_[!_]];$___.=${$_}[!_]^${$_}[$_[!_]]|$__[!_].($$$_=$__[!_]^_^$__[!!_]).
$$$_.($_[_]=$__[$_[!_]]^_^${$_}[$_[!_]>>!!_]);$$_($___.
(~${$_}[~-$_[!_]]&$___[$_[!_]]).($_[_]&~$___[!!_]));
Это настоящий код на PHP, он работает и выполняет заявленное. За вдохновение спасибо неизвестному автору бэкдора, как только я увидел код, понял, что так написать можно что угодно.
Что вкратце происходит у меня. Я создаю массив, привожу его к строке, получается слово «Array» (это такая особенность PHP, если кто не знает), потом при помощи бинарных операций над буквами (с буквами можно использовать «~», «&», «|», «^», а так же операцию инкремента, получая другие буквы), собираю из этого слова слово «printf» (точнее «prINTf», функции в PHP регистронезависимые), которое в дальнейшем будет использовано в качестве имени функции. Потом из двух слов — «Array», «prINTf» и знака подчёркивания теми же бинарными преобразованиями получаю «Hello!» с переводом строки.
Например, буква «N» получается операцией «A» | «_» | ~«r» с последующим инкрементом результата, а «l» (латинская «эл») — «A» ^ «r» ^ «_». Подчёркивание можно использовать без кавычек — все незакавыченные идентификаторы PHP рассматривает как строки. Кое-где там используются похожим образом получаемые цифры, но это уж совсем не интересно рассказывать.
В конце просто вызываю функцию, передавая ей полученную строку.
Лайк! :-)
Комментарий для PastorGL:
По вашим многочисленным просьбам ;)
Скрипт радостен. В нём три раза встречается смайл ^_^
Комментарий для ramil1017.ya.ru:
Ага, я специально подчерк в центр ставил :)
А не спортивнее ли привести число (полученное инкрементом false, как и сейчас) к строке (например, конкатенацией с еще одним нулем)? Тогда не придется полагаться на приведение массива к слову Array.
P.S. Я неправильно выразился. Не инкрементом, а плюсом, конечно же. Что-то вроде @$_=(+_).(+_); и т. д.
Комментарий для extremus.livejournal.com:
А что плохого в том, чтобы полагаться на это приведение? Оно документированное.
Ничего плохого. Разве что слишком произвольная, причудливая особенность. Или она и есть соль фокуса? Тогда выходит я просто упустил шутку.
Комментарий для extremus.livejournal.com:
Можно обойтись из без неё, если не выкидывать подчёркивание. Если и им не пользоваться, то я навскидку не знаю способа как обойтись одними числами.
Это ж JAPH ( http://en.wikipedia.org/wiki/JAPH ), только на PHP.
Круто! И очень интересно.
В 5.5 уже не работает?