PHPFuck

JSFuck у нас уже был (это намёк на язык Брейнфак, а не ругательство), почему бы не изобрести PHPFuck?

Часа полтора потратил на скрипт, который выводит слово «Hello!»:
<?
$__=$_[$_[]++].=$_;$_[!_]+=++$_[!_];@$$_=($_[$$_][$_]&$_[$$_][$_[!_]]).$_[$$_][$_];
$_[]=&$$_;@$$_.=$_[!!_][$__]^$__[$_[!_]]|$__[!_];$___=$__[!_]|_&~$__[!!_];
@$$_.=++$___.($__[$_]^_^$__[$_[!_]]).($_[!!_][!$_]^$_[_==_][$_[!_]>>!!_]^_);
$___&=$__[$_[!_]];$___.=${$_}[!_]^${$_}[$_[!_]]|$__[!_].($$$_=$__[!_]^_^$__[!!_]).
$$$_.($_[_]=$__[$_[!_]]^_^${$_}[$_[!_]>>!!_]);$$_($___.
(~${$_}[~-$_[!_]]&$___[$_[!_]]).($_[_]&~$___[!!_]));
Это настоящий код на PHP, он работает и выполняет заявленное. За вдохновение спасибо неизвестному автору бэкдора, как только я увидел код, понял, что так написать можно что угодно.

Что вкратце происходит у меня. Я создаю массив, привожу его к строке, получается слово «Array» (это такая особенность PHP, если кто не знает), потом при помощи бинарных операций над буквами (с буквами можно использовать «~», «&», «|», «^», а так же операции инкремента и декремента, получая другие буквы), собираю из этого слова слово «printf» (точнее «prINTf», функции в PHP регистронезависимые), которое в дальнейшем будет использовано в качестве имени функции. Потом из двух слов — «Array», «prINTf» и знака подчёркивания теми же бинарными преобразованиями получаю «Hello!» с переводом строки.

Например, буква «N» получается операцией "A" | "_" | ~"r" с последующем инкрементом результата, а «l» (латинская «эл») — «A» ^ «r» ^ «_». Подчёркивание можно использовать без кавычек — все незакавыченные идентификаторы PHP рассматривает как строки. Кое-где там используются похожим образом получаемые цифры, но это уж совсем не интересно рассказывать.

В конце просто вызываю функцию, передавая ей полученную строку.
16 сентября 2013 22:13

PastorGL (инкогнито)
17 сентября 2013, 00:42

Лайк! :-)

Евгений Степанищев (bolknote.ru)
17 сентября 2013, 06:10, ответ предназначен PastorGL

По вашим многочисленным просьбам ;)

Рамиль К (ramil1017.ya.ru)
17 сентября 2013, 10:48

Скрипт радостен. В нём три раза встречается смайл ^_^

Евгений Степанищев (bolknote.ru)
17 сентября 2013, 11:58, ответ предназначен Рамиль К (ramil1017.ya.ru):

Ага, я специально подчерк в центр ставил :)

extremus (extremus.livejournal.com)
18 сентября 2013, 00:35

А не спортивнее ли привести число (полученное инкрементом false, как и сейчас) к строке (например, конкатенацией с еще одним нулем)? Тогда не придется полагаться на приведение массива к слову Array.

extremus (extremus.livejournal.com)
18 сентября 2013, 00:58

P.S. Я неправильно выразился. Не инкрементом, а плюсом, конечно же. Что-то вроде @$_=(+_).(+_); и т.д.

Евгений Степанищев (bolknote.ru)
18 сентября 2013, 08:08, ответ предназначен extremus (extremus.livejournal.com):

А не спортивнее ли привести число (полученное инкрементом false, как и сейчас) к строке (например, конкатенацией с еще одним нулем)? Тогда не придется полагаться на приведение массива к слову Array.
А что плохого в том, чтобы полагаться на это приведение? Оно документированное.

extremus (extremus.livejournal.com)
18 сентября 2013, 11:54

Ничего плохого. Разве что слишком произвольная, причудливая особенность. Или она и есть соль фокуса? Тогда выходит я просто упустил шутку.

Евгений Степанищев (bolknote.ru)
18 сентября 2013, 12:23, ответ предназначен extremus (extremus.livejournal.com):

Можно обойтись из без неё, если не выкидывать подчёркивание. Если и им не пользоваться, то я навскидку не знаю способа как обойтись одними числами.

dionys.myopenid.com (инкогнито)
18 сентября 2013, 21:25

Это ж JAPH (http://en.wikipedia.org/wiki/JAPH), только на PHP.

Игорь (инкогнито)
30 ноября 2014, 15:47

Круто! И очень интересно.

aktuba (инкогнито)
9 декабря 2014, 13:13

В 5.5 уже не работает?

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)