ugrás a tartalomhoz

Gyerekosztály type hinting-gel E_RECOVERABLE?

janoszen · 2008. Ápr. 5. (Szo), 10.11
Sziasztok,

egy elég furcsa hibával találkoztam:

Argument 1 passed to BasicCore::run() must be an instance of Environment, instance of HTTPEnvironment given, called in...


(Ez E_RECOVERABLE típusú volt.) Holott:

class HTTPEnvironment extends Enviroment


Ugyanakkor a teszteset:
<?php

class Foo
{
}

class Bar extends Foo
{
}

class Test
{
	static function testfunc(Foo $f)
	{
		echo("Hi!");
	}
}

Test::testfunc(new Bar());

?>
Ez szépen kiadja a kimenetet. A PHP doksi szerint:

If the error is not caught by a user defined handle (see also set_error_handler()), the application aborts as it was an E_ERROR.


Mindamellett az alkalmazásom tökéletesen fut, csak ez a hiba megakasztott kicsit. Yet an other PHP bug, vagy van ennek valami racionális magyarázata és én barmoltam el valamit? Esetleg találkozott már valaki ilyesmivel?

Ha valaki szeretne a teljes kódon tesztelni, letölthető az SVN repómból: https://secure.pasztormuvek.hu/svn/cms2/trunk/ A make könyvtárban van linux makefile hozzá, amivel össze lehet rakni. (Egyébként az egész egy technológia teszt, valószínű, hogy nem nagyon lesz belőle éles rendszer sose. Ennek megfelelően néhány elég fontos dolog nincs is benne.)
 
1

Teszt

janoszen · 2008. Ápr. 5. (Szo), 10.12
Még annyit elfelejtettem, ha esetleg nekiáll valaki tesztelni (bár a méretét tekintve egyéltalán nem veszem zokon, ha nem), a /boot/modules/kernlog.php-ba tett valamilyen kiiratással lehet megnézegetni a hibákat, a syslog modul ugyanis még nincs kitesztelve. :)
2

Sajnos...

Velias9 · 2008. Ápr. 8. (K), 17.35
... most nem tudom megnézni a könyvet, ahol láttam, de én úgy emlékszem, hogy instanceof ha azt adod meg, hogy a 'Foo' osztályúakat fogaja el, akkor a gyermekeit nem fogadja el.
Van azonban egy módszer, amivel ellenőrizheted:

class Foo  
{  
}  
 
class Bar extends Foo  
{  
}  

class Test  
{  
	static function testfunc(Foo $f)  
	{
		if (is_a($f, "Foo")
		{
			print("Hi!");  
		}
		else
		{
			throw new Exception("Rosz osztályú objektum", 666);
		}
	}  
}  
 
Test::testfunc(new Bar());
Nem a legtökéletesebb, de nem jutott eszembe jobb.