PHP, te csodas...

Hogy most ez PHP 5.3 ujitasok, vagy az Apple altal szallitott PHP extrasagai, azt nem tudom (ejjel fel 3-kor nem volt kedvem bekapcsolni a windowsos gepet tesztelgetni), de a faszomert kell egy meglevo fuggveny a callbackek mukodeset mukodeset elkurni?

Fejlesztgetek egy rendszert, ami epp egy ajaxos kerest hajtana vegre. Az ajaxos keres (most a vartnak megfeleloen) egy Exception-t fog eredmenyezni (mert meg nincs megirva minden kod). Ezzel nem is lenne semmi gond, keretrendszer elkapja, latja, hogy Ajax-s keres, meg is hivja a megfelelo critical error handlert, jelen esetben igy:

call_user_func(array($criticalErrorHandler, 'write_critical_error'),
			$msg_text, $msg_title, $ex);

Ez eddig olyan szepen mukodott, mint a kisangyal.

<flamethrower>

Nem tudom, mi ez a baromsag, de nem vicces. Es ugye, most arrol ne kezdjunk el flamelni, hogy a PHP az egy szep enterprise ready, kiszamithato fejlesztest koveto nyelv. Masik kedvencemet szinten a heten talaltam. Olvasgatom az egyik, nem is annyira ritkan hasznalt fuggveny dokumentaciojat (sajnos mar nem tudom melyik volt az, de elo fogom keriteni). 5.0.2-ben modositottak az egyik parameter mukodesen. Igazabol a modositas celjaval tokeletesen egyetertek, mert nekem az jo volt. Csak ezt mi a retkes faszomert egy HIBAJAVITO verzioban kell elkovetni? Miert nem az 5.1.0-ban?

Rakjunk mindenhova Linuxot, MySQL-t, meg PHP-t, mert hudefasza openszosz. Jah, csak epp, akik itt annyira istenitik a PHP-t, azok nagy resze jol lathatoan egy sor kodot nem irt meg. Egy programozasi nyelvnek/API-nak inkabb ne legyen par evig uj verzioja, de ha egyszer megjelent, az legyen kobe vesett.

Release early, release often-bol a release often eles felhasznalasra szvsz fassag.

</flamethrower>

////
Szerk: torolve, hulgyeseget irtam

////
Szerk.2: Megvan:

public static function write_critical_error($message, $title, Exception &$ex = null)

helyett:

public static function write_critical_error($message, $title, Exception $ex = null)

Fantasztikus.

Hozzászólások

Ez azért van, mert az objektum eleve referencia, ezért átadáskor felesleges a &. Ezért az Exception &$ex kifejezésnek a paraméterlistában semmi értelme (adj át renferenciaként egy objektumot, ami eleve referencia). A PHP 5.3 előtti verziók elnézőek voltak ezzel, a PHP 5.3 már nem, mivel ott szigorodtak a referenciaátadással kapcsoldatos dolgok.

De az ilyet sem lehet már megcsinálni:
function foo($bar) {}
$baz = '';
foo(&$baz);

Továbbá ez is warning-ot generál (ez sok contribnál okoz szép nagy narancssárga (xdebug :) ) warningokat):

function foo(&$bar) {}
foo(1);

En kitartok amellett, hogy ez call_user_func bug.

<?php

error_reporting(E_ALL | E_STRICT);

header('Content-type: text/plain');

function foo($round, &$bar)
{
	echo __FUNCTION__.' : '.$round.' : '.gettype($bar)."\n";
}

function baz($round, $bar)
{
	echo __FUNCTION__.' : '.$round.' : '.gettype($bar)."\n";
}

class A {}

$foo = 'foo';
$baz = 'baz';
$a = new a();
$b = array();

foo('obj, siman', $a);				// OK
$foo('vv', $a);					// OK
call_user_func('foo', 'calluserfunc', $a);	// Fail

foo('tomb, siman', $b);				// OK
$foo('vv', $b);					// OK
call_user_func('foo', 'calluserfunc', $b);	// Fail

echo "\n";


// Ez midnen tovabbi nelkul megy
baz('obj, siman', $a);
$baz('vv', $a);
call_user_func('baz', 'calluserfunc', $a);

baz('tomb, siman', $b);
call_user_func('baz', 'calluserfunc', $b);
$baz('vv', $b);

// PHP 5.2.6, Windows XP

foo : obj, siman : object
foo : vv : object
foo : calluserfunc : object
foo : tomb, siman : array
foo : vv : array
foo : calluserfunc : array

baz : obj, siman : object
baz : vv : object
baz : calluserfunc : object
baz : tomb, siman : array
baz : calluserfunc : array
baz : vv : array

// PHP 5.3.0, MacOSX
// Szerk: PHP 5.3.2, Windows XP

foo : obj, siman : object
foo : vv : object
Warning: Parameter 2 to foo() expected to be a reference, value given in ...
foo : tomb, siman : array
foo : vv : array
Warning: Parameter 2 to foo() expected to be a reference, value given in ...

baz : obj, siman : object
baz : vv : object
baz : calluserfunc : object
baz : tomb, siman : array
baz : calluserfunc : array
baz : vv : array

----------------
Lvl86 Troll

De mi az, hogy nem mindig tud? Eddig tudott, most miert nem tud?

Egyebkent a dinamikus fuggvenyhivas egeszen addig jo, mig fuggvenyt, vagy egy objektum metodusat akarom meghivni. Ha egy osztaly statikus metodusat probalom meghivni, akkor rabasztam.

Szerk:

Pontositok:PHP 5.3-tol valoban megy a $classname::function(). Csak azzal en nem vagyok kisegitve meg, mert alapbol 5.2-n kellene mennie, csak jo lenne, ha az 5.3-n is tudnek fejleszteni (nameg, jovoben ugy is kell majd tamogatni). Szoval akkor most ugy allunk, hogy vegre megcsinaltak az 5.2 hianyossagat, ellenben elrontottak az 5.3 call_user_func() -jat. Csodaszep :)

----------------
Lvl86 Troll