Tuesday, November 29, 2005

PHP 5

Забавен ден, посветен на новия обектен модел на PHP 5. Имаше няколко спора относно присвояването на обекти директно и по референция и утре май ще има още, защото или не съм разбрал както трябва SASh, или хич не съм съгласен с него. Ставаше дума за следното:

class foo{
    public $id = 1;
}

$a = new foo();
$b = $a;
$c = &$b;
unset($b);

Получава се, че $b сочи към $a, a $c съвпада с $b.

Идеята беше, че unset($b) ще унищожи и $c, но всъщност не се получава така. Би се получило така ако бяха псевдоними, а не референции. Същевременно обаче двете споделят памет, тъй като при промяна на стойността на една от тях се променя и другата:

unset($b);
echo $c->id; //1
----------------
$b = null;
echo $c->id; // няма обект

Което ще рече, че двете са референции на една и съща област от паметта, но при unset() на една от тях не се унищожава общата памет (както SASh се опитваше да ме убеди), а се премахва само референцията към нея (както е в perl).

Иначе в новото PHP има доста хубавки неща, едно от което ми хареса особено много. SASh го нарече hinting:

class foo1{
    // whatever
}

class foo2{
    public function bar(foo1 $obj){
        // whatever
    }
}

Ако подадената на bar() стойност не е точно обект от foo1, bar() трещи с Fatal Error. Нещото просто те кара да си пишеш нещата като хората! :)
Също интересна е и новата константа за грешки E_STRICT.

2 comments:

Anonymous said...

Ами то така или иначе ще изтрещи, щото fuinction не е много част от езика ;)

Освен туй както седят нещата не си личи много разликата между foo1 и fool ;)

ro-tex said...

Айде сега - заядливец...
fuinction е печатна грешка, защото парчетата код са писани за тук, а не са реалните парчета, с които тествах - не ми се dump-ваха 20-30 реда gibberish code тук.
Мерси за забележката обаче - поправих се.

Що се отнася до foo1 и foo2 - ми зависи си от font-а ти, пич. :) Освен това за компилатора са си перфектно различими. Пък и foo1 или fool - Whot's the odds, so long as your 'appy? ;P