クラス名と同名のメソッド名がある場合の挙動

PHP 4.x 系ではクラスのコンストラクタはクラス名と同名のメソッド名で定義する。
PHP 5.x 以降は __construct() というメソッド名がコンストラクタとなる。
クラス名と __construct() を同時に定義した場合以下のようなエラーが出ると思ってた*1

Strict standards: Redefining already defined constructor for class

実際 Pear::Net_URL_Mapper は Net_URL に依存してて、E_ALL | E_STRICT とかで使うと上記のエラーが出る。
PHP 5.3.3 で確認。

<?php
class Foo
{
    public function Foo()
    {
        var_dump(__METHOD__);
    }
    public function __construct()
    {
        var_dump(__METHOD__);
    }
}
error_reporting(E_ALL|E_STRICT);
$foo = new Foo();
Strict standards: Redefining already defined constructor for class Foo in /tmp/test.php on line 9

string(16) "Foo::__construct"

が、__construct() の定義を先に書くと、

<?php
class Foo
{
    public function __construct()
    {
        var_dump(__METHOD__);
    }
    public function Foo()
    {
        var_dump(__METHOD__);
    }
}
error_reporting(E_ALL|E_STRICT);
$foo = new Foo();
string(16) "Foo::__construct"

エラーが出ない!!


名前空間がある場合は?

<?php
namespace Foo;
class Foo
{
    public function Foo()
    {
        var_dump(__METHOD__);
    }
    public function __construct()
    {
        var_dump(__METHOD__);
    }
}
error_reporting(E_ALL|E_STRICT);
$foo = new Foo();
string(20) "Foo\Foo::__construct"

PHP 5.3.3 では名前空間に属しているクラス名と同名のメソッド名はただのメソッドとして扱われるようになったので、この挙動は正しい。
名前空間に無い場合で、__construct() が先に定義されている時にエラーにならないのが意外だった。
ていうかこの挙動は正しいの?

*1:error_reporting に E_STRICT を設定してる場合