Очень сырой журнал (по крайней мере про php5 написано сыро)
1) В тексте написано __destructor () в коде __destruct () (что правильно)
2) В тексте написано instanceof в коде instance of (что неправильно)
3) Большая путаница с clone и object::__clone() (в разных местах по разному написано, причем не только в тексте, но и в коде - даже есть где в тексте написано правильно, а в коде нет):
a) использовать __clone на объкте нельзя - compile error обеспечен
b) использовать $that в __clone () недопустимо, в связи с тем что __clone () вызывается
после того, как все свойства будут скопированы.
Вот пример оригинальный
PHP:
<?php
class Node {
private $next;
private $name;
function __clone() {
$this->name = $that->name;
$this->next = null;
}
function setName($name) { $this->name = $name; }
function getName() { return $this->name; }
function setNext(Node $next) { $this->next = $next; }
}
$n1 = new Node();
$n1->setName('Node1');
$n2 = new Node();
$n2->setName('Node2');
$n1->setNext($n2);
$n = $n2->__clone();
print_r($n);
?>
На что php (PHP 5.0.0RC3 (cli) (Zend Engine v2.0.0RC3 with Xdebug v2.0.0dev) отвечает:
Fatal error: Cannot call __clone() method on objects - use 'clone $obj' instead in - on line 18
И вот как этот код должен был выглядеть
PHP:
<?php
class Node {
private $next;
private $name;
function __clone() {
$this->next = null;
}
function setName($name) { $this->name = $name; }
function getName() { return $this->name; }
function setNext(Node $next) { $this->next = $next; }
}
$n1 = new Node();
$n1->setName('Node1');
$n2 = new Node();
$n2->setName('Node2');
$n1->setNext($n2);
$n = clone $n1;
print_r($n);
?>
ЗЫ. Код как оказалось вообще был изначально лишен смысла, т.к. копироваля, объект, который был выдомым, а не ведущим...
---add---
Я не понимаю почему все пишут, что только в 5 версии стало возможным инициализировать свойства классов не в консрукторе, а непосредственно в объявлении? Это было доступно еще в php4 (но только простыми типами). В php5 с обычными и статическими свойствами ситуация
изменилась, но
совсем не так. Их можно инициализировать как хочешь (ну почти

)
PHP:
<?php
class a {
static $q = array ('a', 'b', 'c');
}
var_dump (a::$q);
?>
вывод:
Код:
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
В php 4 такая конструкция вызовет parse error...
---add---
function myFunction(Unrequired $param = null) {
Такая конструкция недопустима (вернее допустима, но не имеет абсолютно никакого смылса), т.к. NULL никогда не является предком в наследования (о чем, кстати, написано в журнале на один абзац выше). Возможно только
function myFunction(Unrequired $param)...
или
function myFunction($param = null)...
---add---
Хотя PHP5 beta 3 этот алгоритм проработан не полностью (__toString() срабатывает только во время использования указателя на объект в операторе print), это открывает интересные перспективы.
В PHP5RC3 __toString () вызывается только при использовании в echo или print. И это не будет, видимо, менятся из-за каких-то проблем в ZE2:
news.txt про php5rc1:
- Changed __toString() to be called automatically only with print and echo statements. (Andi)
...
- Fixed bug #27125 (strval() doesn't work for objects with __toString()). (Marcus)
====================
Ребят ей-богу, хотя бы примеры прогнали про php5. И увидели, что там полно глюков и несостыковок, вылезли в форуме с вопросами, а там и я нашелся

(и, естественно, поправил бы оригинал перед публикацией)