Давно хотел сам построить какой нибудь красивый фрактал. Ясное дело мне это совсем не было нужно, пока не встала задача раздать студентам расчетно-графическую работу по программированию.
Студент нынче какойто хилый пошел, пришлось самому разбираться, вот она наша прелессссть.

Исходники можно скачать здесь
Я давно подозревал, что многие вещи уже давно придуманы, даже те что могут показаться полным бредом.
Вот например новый термин - "Созерцательное программирование". Русский поиск в гугле не дает много результатов на это словосочетание, - оно является моей версией перевода термина Contemplative Programming.
Просто в время работы иногда бывает такое состояние, когда видишь в голове вещь и реализуешь ее в программе, постепенно приближая к идеалу. Именно в такие моменты становится совершенно не важно где ты как ты, совершенно ничего не отвлекает, есть только вещь которую ты созерцаешь, творишь, достаешь из небытия.
Именно в такие моменты можно сделать что-то стоящее, а не когда натужно колотишь по клавишам ожидая когда количество перейдет в качество, хотя так тоже частенько случается.
Сегодня потратил несколько часов не поиск банальнейшего бага. Дело в том что в PHP ссылку нельзя сделать статической, так как я перешел уже на PHP5 то об этом я не всегда помню.
Не работает:
class SomeClass {
function singleton(){
static $instance = null;
if ($instance==null){
$instance =& new SomeClass();
}
}
}
Работает:
class SomeClass {
function singleton(){
static $instance = null;
if ($instance==null){
$instance = new SomeClass();
}
}
}
В пятом PHP будет работать только первый вариант, второй правда хотя и со скрипом, то тоже будет (будет ругаться чтобы к функции поставили модификатор static и не использовали никаких амперсандов у оператора new)
Обычно я использлую цикл while когда нужно сделать итерацию по дочерним элементам XML нода, а тут решил что цикл for для этих целей подходит гораздо лучше.
было:
var item = element.firstChild;
while(item!=null){
if ((item.nodeType==1) and (item.nodeName=='tagname') {
//здесь код
}
item = item.nextSibling;
}
стало:
for(var item = element.firstChild;item!=null;item = item.nextSibling;){
if ((item.nodeType==1) and (item.nodeName=='tagname') {
//здесь код
}
}
Идея глобальных переменных просто замечательная, однако многие не рекомендуют их использовать, т.к. это нарушает архитектуру программы и может привести к непредвиденным результатам, так это или не так, однако, наряду с недостатками есть у них и достоинства - к ним всегда можно обратиться из любого места в программе, особенно не заморачиваясь.
В PHP есть также т.н. суперглобальные переменные - $_POST, $_GET.
Уж не знаю почему разработчики их допустили, в ведь у суперголобальных переменных недостатки глобальных переменных становятся супернедостатками. Ну да не об этом речь.
Захотелось мне сделать свои суперглобальные переменные куда я хочу поместить значения из $_POST и $_GET, но без magic_quotes.
Зачем это нужно? Да просто мне не очень хотелось портить оригинальные значения переменных из соображений универсальности кода.
Как быть? Суперглобальные переменные нельзя создать - они накрепко зашиты в PHP и новые суперглобальные переменные сделать невозможно, но я нашел один выход из данной ситуации.
PHP5 позволяет создавать статические переменные класса, т.к. область видимости класса - весь код, то и полученная переменная ведет себя как суперглобальная. Красота.
class Site{
static $POST;
static $GET;
static $COOKIE;
static function stripslashes($val){
$type = gettype($val);
if ($type=='string'){
return stripslashes($val);
}
elseif($type=='array'){
$var1 = array();
foreach($val as $key=>$value){
$var1[$key] = Site::stripslashes($val[$key]);
}
return $var1;
}
else {
return $val;
}
}
static function initSite(){
if (ini_get('magic_quotes_gpc')){
Site::$GET = Site::stripslashes($_GET);
Site::$POST = Site::stripslashes($_POST);
Site::$COOKIE = Site::stripslashes($_COOKIE);
}
else {
Site::$GET = $_GET;
Site::$POST = $_POST;
Site::$COOKIE = $_COOKIE;
}
}
}
Site::initSite();
При этом полученные переменные Site::$POST и Site::$GET ведут себя также как и аналогичные классические аналоги $_POST и $_GET.