Newsgroups: php.doc,php.internals Path: news.php.net Xref: news.php.net php.doc:969379124 php.internals:39101 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 81710 invoked from network); 19 Jul 2008 15:40:20 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 19 Jul 2008 15:40:20 -0000 Authentication-Results: pb1.pair.com header.from=helly@php.net; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=helly@php.net; spf=unknown; sender-id=unknown Received-SPF: unknown (pb1.pair.com: domain php.net does not designate 85.214.94.56 as permitted sender) X-PHP-List-Original-Sender: helly@php.net X-Host-Fingerprint: 85.214.94.56 aixcept.net Linux 2.6 Received: from [85.214.94.56] ([85.214.94.56:55062] helo=h1149922.serverkompetenz.net) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 7F/CF-13864-2EA02884 for ; Sat, 19 Jul 2008 11:40:20 -0400 Received: from MBOERGER-ZRH.corp.google.com (unknown [193.142.125.1]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by h1149922.serverkompetenz.net (Postfix) with ESMTP id 27C2011EFD5; Sat, 19 Jul 2008 17:40:16 +0200 (CEST) Date: Thu, 17 Jul 2008 22:46:24 +0200 Reply-To: Marcus Boerger X-Priority: 3 (Normal) Message-ID: <1061321119.20080717224624@marcus-boerger.de> To: Jochem Maas CC: Marcus Boerger , Derick Rethans , Gergely Hodicska , PHP Documentation List , "internals@lists.php.net" In-Reply-To: <487F8379.4070801@iamjochem.com> References: <4875821E.9020504@avalon.aut.bme.hu> <20080710045418.GA22262@panix.com> <487599FA.9000207@avalon.aut.bme.hu> <4875CE7F.9090308@avalon.aut.bme.hu> <48764379.3010304@iamjochem.com> <1672378551.20080712122931@marcus-boerger.de> <487F18FE.1070600@iamjochem.com> <1929951966.20080717131829@marcus-boerger.de> <487F8379.4070801@iamjochem.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [PHP-DEV] strange autoload behavior From: helly@php.net (Marcus Boerger) Hello Jochem, Thursday, July 17, 2008, 7:38:01 PM, you wrote: > Marcus Boerger schreef: >> Hello Jochem, >> > ... >>> I just posted another mail to internals in which I attempt to detail the >>> __autoload behaviour 'issues' ... it includes something that wants to be a >>> test suite when it grows up ... it might help someone to investage/determine >>> what __autoload() does/should do: >> >>> http://iamjochem.com/autoload_behaviour_tests.zip >> >> Great! More tests :-) >> >> It is quite a lot of stuff and I'd like to see this turned into .phpt's. > it looks more than it is, the runtests.sh script makes viewing the results > of the variations in settings/code easier. > if you unzip the file and execute ./runtests.sh with no args it goves you > all the options ... at this stage I wrote primarily to figure out what > actually happens under any number of conditions. > I'd love to take a shot at converting them to .phpt I see 3 problems > 1. I don't know .phpt (I can solve this) http://qa.php.net/write-test.php http://somabo.de/talks/200703_montreal_need_for_testing.pdf or .pps > 2. I have no idea what to expect and therefore test for > (this needs to be determined/clarified!) Write the tests as good as you can and if you are unsure about the result mail. > 3. In the case that I need to test for an uncaught Exception I wonder > how to determine a pass (ie uncaugh exception thrown as expected) given > that the exact output is dependent on the full path of the relevant script Zend/tests/exception_008.phpt is a test for an uncaught exception that is made dynamic enough to work everywhere. In general we use EXPECTF as soon as error messages or exceptions are expected. Then we replace: - path's including the last path separator with '%s' - line numbers with '%d' - object identifiers '#' with '#%d' marcus > any advice as to how to proceed, especially with regard to point 2. > rgds, > Jochem >> >> marcus >> >>>> That is they >>>> are simply ignored. >> >>> and so I thought :-) which is why some of my test's output "wtf!" :-) >> >>> as always, thanks for your feedback, >>> regards, >>> Jochem >> >>>> And once all __autoload work is done and the class >>>> still doesn't exist an E_ERROR is issued. The work around for cases where >>>> the class must not exist (e.g. when no E_ERROR is needed would be >>>> collecting the exceptions. That is the base Exception class would get an >>>> additional property and getter: >>>> private $previous_exception; >>>> function public getPreviousException(); >>>> That way we could let the exceptions bubble up (though some smaller engine >>>> changes are necessary). >> >>> currently you can throw an exception out of __autoload() unless __autload() >>> is triggered by the 'new' syntax or by a static method call (e.g. MyClass::myMethod()), >>> with other 'triggers' (e.g. call_user_func()) the exception comes through ... >>> in cases that it doesn't you can get an exception out of __autoload() via the >>> eval() trick [see below] ... I don't suppose there is anyway of asking the engine >>> which way __autoload() was triggered from inside the __autoload() code? >> >>>> marcus >>>> >>>> Thursday, July 10, 2008, 7:14:33 PM, you wrote: >>>> >>>>> Derick Rethans schreef: >>>>>> On Thu, 10 Jul 2008, Gergely Hodicska wrote: >>>>>> >>>>>>>> exceptions thrown during autoload are ignored. >>>>>>> And one more thing, this is in the manual: >>>>>>> "Note: Exceptions thrown in __autoload function cannot be caught in the catch >>>>>>> block and results in a fatal error." >>>>>>> >>>>>>> I think your explanation makes much more clear what happens, maybe it would >>>>>>> worth to upgrade the manual. While the quoted text suggests that that if throw >>>>>>> an exception I just can't catch it and will bubble up to top level and this >>>>>>> cause the fatal error. >>>>>> You can actually catch it *in* the autoload method, it just wouldn't >>>>>> bubble out of it. >>>>> the manual could do with that tidbit, maybe also the hack for 'getting the >>>>> exception out' of __autoload() ... >>>>> function __autoload($class) >>>>> { >>>>> try { >>>>> throw new Exception('foo'); >>>>> } catch (Exception $e) { >>>>> self::handleDebug($e); >>>>> >>>>> if (!class_exists($class, false)) >>>>> eval(sprintf(' >>>>> class %1$s >>>>> { >>>>> public function __construct() { >>>>> throw new AL_Exception("Class %1$s not found: %2$s"); } >>>>> public function __call($m, $a) { >>>>> throw new AL_Exception("Class %1$s not found: %2$s"); } >>>>> public static function __callStatic($m, $a) { >>>>> throw new AL_Exception("Class %1$s not found: %2$s"); } >>>>> }', $class, $e->__toString())); >>>>> } >>>>> } >>>>> which works best when __autoload() isn't triggered by class_exists("Foo", true) >>>> >>>>>> regards, >>>>>> Derick >>>>>> >>>> >>>> >>>> >>>> >>>> Best regards, >>>> Marcus >>>> >>>> >> >> >> >> >> Best regards, >> Marcus >> >> Best regards, Marcus