ЖЖ от 2006-07-01 12:02:00

Как-то я предлагал dar_xide и ilyabirman игру — заходить на сайты американских блоггеров и, если у них не оказывалось постов, где они хорошо отзываются о неграх, обязательно спрашивать их почему таких постов нет. Т.е. поиграть в игры «вы расист?». Мною предполагалось, что реакция может быть достаточно сильной, у меня ощущение, что американцы помешались на этой теме. Правда, из затеи ничего не вышло. А вот теперь есть шанс посмотреть на реакцию шведов. Формальная причина — «улучшение» снимка студией Лебедева, где мулатку заменили на белую девушку:

http://www.artlebedev.ru/portfolio/routine/2006/07/01/

11 комментариев

Загадки PHP

Да что это я всё о себе, да о себе? Давайте я вам лучше о PHP расскажу! PHP, несмотря на кажущуюся простоту, язык уникальный своими загадками. Возникают, они, в основном из-за того, что какие-то вещи делались в PHP хаками, чаще — как бог на душу положит. Например, ссылки.

Ссылки в PHP — совершенно особая сущность. Небольшой ликбез. Ссылка — это способ «соединить» две переменные так, что меняя значение одной, меняется значение второй и наоборот. Записывается ссылка очень просто: $foo = &$bar. Кажущаяся простота ссылок обманчива. Я сейчас буду рассматривать PHP5, поскольку мне кажется, что четвёртая версия должна умереть как можно скорее. Все примеры были проверены под PHP 5.1.4 и PHP 5.2.0RC1 под Windows и Linux.

<?php
    $a = new stdClass();
    function Bar($bar)
    {
        $bar->val = 1;
    }
    Bar($a);
    print_r($a);

Проблема номер раз. Как вы думаете, что напечатает print_r? Отвечу сразу: он покажет свойство «val» со значением «один». Почему так произошло? Дело в том, что в PHP5 (как и во многих других языках) все объекты передаются по ссылке. Это значит, что переменная $bar в функции ссылается на переменную $a, которую мы указали в качестве параметра и все изменения $bar коснутся переменной $a. Если мы вызовем функцию «Bar» с другим параметром, то $bar будет ссылаться на этот новый параметр.

Ситуация, когда объект в функцию нужно передать по значению, на практике — почти невероятна, впрочем, если она и возникнет, объект всегда можно клонировать — в PHP5 есть специальные конструкции.

<?php
    $v = array(1);
    $b = &$v[0];
    $c = $v;
    $v[0] = 100;

    echo $c[0];

Проблема номер два. Что же будет внутри $c[0]? Странно, но — 100. Как же так? Всё просто. В PHP, если мы создали ссылку на переменную, то оба имени переменных становятся ссылками. Получается, что присваивая $c внутренность $v, я его присваиваю вместе с $v[0], которая стала ссылкой.

Странно? Совсем нет. Дело в том, что имя переменной — это тоже ссылка. Ссылка на область памяти, где записано её значение. Если ссылок на место, занимаемое переменной, больше чем одна, то все её имена ведут себя как «ссылка», если же удалить «лишние», то последнее имя теряет свою «ссылочность». Пример:

<?php
    $v = array(1);
    $b = &$v[0];

    var_dump($v);

    unset($b);

    var_dump($v);

Первый «var_dump» покажет нам ссылку, второй — нет.

<?php
    $bar = 1;

    function Foo()
    {
        global $bar;
        $test = 100;

        $bar = &$test;
    }

    Foo();
    echo $bar;

Проблема номер три. Кстати говоря, когда вы используете конструкцию «global», на деле вы используете ссылку. Дело в том, что «global $bar» полностью эквивалентна «$bar =& $GLOBALS[’bar’]». Если вы не знаете что такое $GLOBALS, самое время открыть руководство по PHP и узнать. Так вот. Проблема заключается в том, что «магическое» слово «global» прячет от нас всю эту операцию, поэтому кажется, что в глобальной переменной $bar должно быть значение 100. Это не так.

На деле, «$bar = &$test» вызовет переназначение ссылки. То есть, прежняя ссылка «$bar — это $GLOBALS[’bar’]» пропадёт и на её место встанет «$bar — это $test». Значение $GLOBALS[’bar’], естественно, не изменится.

Ну а теперь, вооружённые этими новыми знаниями, мы рассмотрим следующий интересный пример.

<?php
    $v = array(1);
    foreach ($v as &$item) echo $item;

    function Bar($foo)
    {
        $foo[0] = 100;
    }

    Bar($v);
    var_dump($v);

Итак! Что выведет «var_dump»? Правильно — 100. Почему? Вполне логично — в цикле мы проходим по элементам массива, причём $item ссылается на текущий элемент как ссылка. После цикла остаётся ссылка «$item — это $v[0]», поэтому, когда я передал в «Bar» переменную $v, её нулевой элемент остался ссылкой. Остальное понять труда не составляет. Давайте пойдём дальше.

<?php
    $v = array(1, 2);
    foreach ($v as &$item) echo $item;

    function Bar($foo)
    {
        $foo[0] = 100;
        $foo[1] = 100;
    }

    Bar($v);
    var_dump($v);

Что же тут покажет «var_dump»? Странно, но в обоих элементах массива будет… 100. Казалось бы — bug PHP (впрочем, я не настаиваю — может это и баг). Оказывается, не совсем. Дело в том, что ссылка в PHP уничтожается конструкцией unset и только ей. При переприсвоении ссылки прежняя ссылка не удаляется, точнее, PHP не трогает счётчик ссылок. В моём следующем примере все три переменные будут ссылкой (в чём легко убедиться, сделав «var_dump переменной $GLOBALS»):

<?php
    $v = 1;
    $k = 2;
    $b = &$v;
    $b = &$k;

Первый же unset «восстановит справедливость»:

<?php
    $v = 1;
    $b = &$v;
    $t = &$v;

    $k = 2;
    $b = &$k;

    unset($t);

Теперь переменные $k и $b — ссылочные, а $v — нет. Видимо, «пересчёт» ссылок при пересвоении вызывает какие-то трудности. Хотя эта особенность PHP вызывает целую кучу трудноуловимых багов. Спасибо моему братишке — Олегу Степанищеву за то, что обратил мой внимание на пример с foreach, после чего я и решил структурировать свои знания по этому поводу.

Оставить комментарий

ЖЖ от 2006-07-03 21:13:00

Купил домой электронные весы Bosch (PPW 6420), которые умеют измерять, кроме веса, различные интересные показатели. Итак, я вешу 65 кг, из них 30 кг — мышцы, 3.4 кг — кости, около 10% жира (весы пишут, что это «очень мало», причём, явно не комплимент мне делают), терпимо воды (не помню цифру, но чуть больше оптимальной величины), рекомендуется повысить вес до 70 кг, для чего мне нужно потреблять в день почти 3000 килокалорий.

19 комментариев

[LJ2ME]

Мне сегодня с утра показалось невероятно смешным слово «жидкое». «Поесть жидкого» казалось описанием какого-то извращения, а «покакал жидко» — лучшей шуткой всех времен и народов, которую я, глупо хихикая, повторял всё утро. Это на меня так «Духless» влияет? Кстати, я никак не могу понять главную тему книги. Как можно объявить поколение, представителям которого около 30 — потерянным? Около 30 — лучший возраст для мужчины, если он, конечно, не успел раздолбать собственное тело.

17 комментариев

ЖЖ от 2006-07-11 17:38:00

Я, господа, хочу признаться — я смотрел сериал «Не родись красивой». Из-за Киры Воропаевой, к которой я спокойно-неравнодушен. Неравнодушен, потому что считаю её идеальной женщиной — женственной, спокойной, преданной, любящей, успешной, умеющий разговаривать, спокойно-неравнодушен, потому люблю . относится так же спокойно — знает, что я не настолько глуп, чтобы влюбиться и возжелать сферического коня в вакууме.

Что миллионы нашли в Кате Пушкарёвой я решительно не понимаю. А вот её папа и мама — отличные типажи, симпатичные персонажи и отличные актёры, особенно мама.

31 комментарий

[LJ2ME]

Говорят, что от кокосовых орехов, упавших на голову людей погибает больше, чем от акул. Думаю, отечественные маршрутные «Газели» должны изменить это соотношение — головы хорошо тренируются на входе и выходе.

2 комментария

ЖЖ от 2006-07-14 19:00:00

Придумали с dar_xide хорошее название для панк-группы. Дарим:
«Художник из Казахстана и его друг стеклодув».

7 комментариев

[LJ2ME]

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

21 комментарий

ЖЖ от 2006-07-21 14:41:00

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

33 комментария

ЖЖ от 2006-07-25 17:26:00

Прочитал у Экслера рецензию на «Ультрафиолет», жалею, что не прочитал её раньше, чем потратил своё время на просмотр фильма. Хотя я купил экранку, где на DVD было ещё пять фильмов кроме этого, я жалею, что потратил время. При всей моей любви к спецэффектам, даже меня рвало и тошнило на протяжении всего фильма. Досмотрел только потому, что, местами, там встречаются некоторые идеи о будущем, которые я не ещё не видел в реализации, а я очень люблю смотреть как другие люди фантазируют на эту тему.

8 комментариев

ЖЖ от 2006-07-29 14:37:00

Видели игру «Отчество» от Yandex'a? Там вводишь имя и фамилию, а Yandex показывает какое отчество чаще всего встречается рядом с этими словами:

Пользователи рунета считают, что Евгений Степанищев имеет отчество Магический (Евгений Степанищев — это я)
Пользователи рунета считают, что Воропаева имеет отчество Владимировна (а вот моё отчество, почему-то, получила )

Кажется, пользователи рунета слишком много сплетничают обо мне:

Пользователи рунета считают, что Мой Член имеет отчество любимый.
Пользователи рунета считают, что Мое Самолюбие имеет отчество необьятное.
Пользователи рунета считают, что Моя Любовница имеет отчество виртуальная.
Пользователи рунета считают, что Моя имеет отчество любовь.

3 комментария

← сюда туда →