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 '#<num>' 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

Reply via email to