Popisovat vadný OOP model v PHP4, který objekty místo předávání kopíruje, snad netřeba. Tato nepříjemnost se řeší naužíváním znaku &. Ten je potřeba použít při:

  • vytváření objektu $object = &new MyClass()
  • přiřazení objektu $objectB = & $objectA
  • předávání objektu funkci function doIt(& $object)
  • vracení objektu funkcí function &getInstance()
  • a volání takové funkce $object = &getInstance()

Při předávání objektu funkci navíc přicházíme o možnost určit výchozí hodnotu – nelze psát function doIt(&$object = null) a komplikuje se vkládání přímých hodnot – doIt('ahoj') je třeba psát jako doIt($var = 'ahoj'). V některých případech ani & nepomůže (např. list() nebo foreach) a je třeba použít speciální konstrukce.

Programátor v PHP4 se s tím naučil žít. Jenže přišlo PHP 4.4.0 a to mu hodilo další klacek pod nohy. Následující konstrukce nově generuje chybu Notice: Only variable references should be returned by reference.

function &factory()
{
	return new MyClass();
}

A jako správné se považuje

function &factory()
{
	$php_4_sucks = &new MyClass();
	return $php_4_sucks;
}

Tedy jako běžné se stanou tyto konstrukce $false = false; return $false;. To je mazec, co?

Co to zkusit zcela jinak?

Docela dlouho jsem přemýšlel, jak celou tu ampersárdnu elegantně obejít. Jak psát PHP5-like skripty, aby jim čtverka rozuměla. Něco mě sice napadlo, ale je to stále řešení na půl cesty.

Aktualizováno 5. 8. 2005

Zde publikovaný způsob jsem nakonec zavrhl a vymyslel elegantnější řešení, viz spot PHP4: zbavme se ampersandů II.