Forum und email

Referência de Objetos (o Ampersand &)

O suporte para orientação a objetos era completamente novo para o PHP 4, e sendo assim, não era muito sofisticado em comparação ao suporte a OO de outras linguagens, como o Java. Na atribuição de objetos GTK à variáveis, era absolutamente necessário não fazer uma cópia do mesmo, mas sim, passá-lo por referência.

//PHP 4: cópia como um comportamento padrão
$a = new GtkLabel();
$a->set_text('1');
$b = $a;
$b->set_text('2');
echo $a->get();//still 1
Então, para não fazer apenas uma cópia, era necessário o uso do ampersand & na atribuição das variáveis:
//PHP 4: construindo referências
$a = new GtkLabel();
$a->set_text('1');
$b = &$a;
$b->set_text('2');
echo $a->get();//is 2 now
Entretanto, uma cópia do objeto ainda é feita: na construção. Para ser totalmente correto, especialmente com widgets, você tinha que fazer:
//PHP 4: referência na construção
$a = &new GtkLabel();

Com o PHP 5 as coisas mudaram: passagem por referência agora é o comportamento padrão; não é preciso mais usar o ampersand! O seguinte script funciona perfeitamente no PHP 5 com o PHP-GTK 2, e sem nenhum problema:

<?php
//PHP5: no Ampersand any more
$a = new GtkLabel();
$a->set_text('1');
$b = $a;
$b->set_text('2');
echo $a->get_text();//is 2
?>

O mesmo se aplica para callbacks: nada de ampersand! Uma vez que você tinha que fazer o seguinte no PHP-GTK 1:

$window->connect_object('destroy', array(&$object, 'function'));
você simplesmente deixa de lado o & com o PHP 5 e o GTK 2:
$window->connect_simple('destroy', array($object, 'function'));