ID:               35634
 Comment by:       rabbitt at gmail dot com
 Reported By:      robert at interjinn dot com
 Status:           Assigned
 Bug Type:         Scripting Engine problem
 Operating System: Linux
 PHP Version:      5.1.1
 Assigned To:      dmitry
 New Comment:

Dmitry - just curious if you have had a chance to look at this patch? I
had discussed it with Sara G. originally, so if you need background I'm
sure you could speak with her (don't know for sure, haven't spoken to
her about it since), or contact me directly.

cheers!,

--
Carl


Previous Comments:
------------------------------------------------------------------------

[2006-11-08 01:59:10] a dot laquerre at videotron dot ca

I have upgraded to from version 5.1 to 5.2 on Windows with Apache and I
have an that error "Class declarations may not be nested".

I had that bug in that case:

class A extends C{

 static public function foo{
 
  require_once(B.class);
 }

}

------------------------------------------------------------------------

[2006-08-14 17:27:28] [EMAIL PROTECTED]

http://www.xaraya.com/~rabbitt/zend.c.patch
Dmitry, could you plz check out this patch?

------------------------------------------------------------------------

[2006-08-08 16:25:26] rabbitt at gmail dot com

if you think about it, it actually makes sense (and it doesn't at the
same time). When the exception is triggered, it's done from within
TestClass (during the declaration of the class
(zend_do_begin_function_declaration())), so the scope is still focused
there. So when errorHandler() is called due to the E_STRICT, it is
including (and thus, declaring) the 'errorClass' inside of the
errorHandler() function *inside* of TestClass.

Personally, I think this is a bug and, that the active_class_entry
should be saved and cleared prior to calling the errorhandler and then
restored afterwards. That would enable the error handler to work with
errors that are emitted within the context of a class that's in the
process of being declared (ie: scope is inbetween
zend_do_begin_class_declaration() and
zend_do_end_class_declaration()).

I'll attach a quick patch that does just this momentarily.

------------------------------------------------------------------------

[2005-12-16 20:22:01] robert at interjinn dot com

I think this report should be given further consideration. I've read
the docs (not that I hadn't before), and I will assume you think this
is bogus because of the following int he PHP docs:

    The following error types cannot be handled with
    a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR,
    E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and
    most of E_STRICT raised in the file where
    set_error_handler() is called.

However, the E_STRICT raised int he error handler script should not be
raised in the first place since it is PHP erroneous context that
believes the class declaration is being nested, when in fact the class
declaration is not being nested. If the include context was properly
scoped, then no E_STRICT would be raised and I wouldn't be having a
problem.

If this is not why this bug was marked bogus, please shed some light
for me, since the bogus comment was pretty uninformative (yes I know
you're busy and don't have time for 50 million bogus bugs but there's
only so much RTFM I can do and hope I can come across exactly what you
think makes this a bogus bug).

Cheers,
Rob.

------------------------------------------------------------------------

[2005-12-11 19:15:37] robert at interjinn dot com

Description:
------------
PHP bails out with class declaration nesting error when an error
handler dynamically loads an error handling class during a class
related E_STRICT warning.

Reproduce code:
---------------
test.php
<?php

set_error_handler( 'errorHandler' );

function errorHandler
( $errorNumber, $errorMessage, $fileName, $lineNumber )
{
    require_once( 'errorClass.php' );
    $error = new ErrorClass();

    $error->handleException(
        $errorNumber, $errorMessage, $fileName, $lineNumber );
}


require_once( 'testClass.php' );

$test = new TestClass();
?>

-------------------------------------------------

testClass.php
<?php

class TestClass
{
    function __construct()
    {
    }

    function TestClass()
    {
        $this->__construct();
    }
}

?>

-------------------------------------------------

errorClass.php
<?php

class ErrorClass
{
    function handleException
    ( $errorNumber, $errorMessage, $fileName, $lineNumber )
    {
        echo "Error: [$errorNumber] $errorMessage
($fileName:$lineNumber)\n";
    }
}

?>



Expected result:
----------------
I expect to properly be able to handle the following E_STRICT in my
custom error class:

<br />
<b>Strict Standards</b>:  Redefining already defined constructor for
class TestClass in <b>/home/suds/testClass.php</b> on line <b>9</b><br
/>



Actual result:
--------------
Fatal error:  Class declarations may not be nested in
/home/suds/errorClass.php on line 4



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=35634&edit=1

Reply via email to