|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2014-03-09 13:57 UTC] celestino dot diaz at gmx dot de
Description:
------------
PHP v5.5.10
Namespaces have an unexpected behaviour depending on the script loading order.
Directory Structure:
Sample
|_ classA.php
|_ classB.php
|_ Subnamespace
|_ classA.php
Test 1:
Output:
Fatal error: Cannot use Sample\Subnamespace\classA as classA because the name is already in use in Sample/classB.php on line 3
Test 2 (changed script oder):
Output:
Sample\classB
Sample\Subnamespace\classA
Sample\classA
Sample\classB
Sample\Subnamespace\classA
Test script:
---------------
Sample\classA.php:
<?php
namespace Sample;
class classA {}
Sample\classB.php:
<?php
namespace Sample;
use Sample\Subnamespace\classA;
class classB {
public $classA;
public function __construct() {
$this->classA = new classA();
}
}
Sample\Subnamespace\classA.php:
<?php
namespace Sample;
class classA {}
Test 1:
$a = new Sample\classA();
echo get_class($a)."\n";
$b = new Sample\classB();
echo get_class($b)."\n";
echo get_class($b->classA)."\n";
Test 2:
$b = new Sample\classB();
echo get_class($b)."\n";
echo get_class($b->classA)."\n";
$a = new Sample\classA();
echo get_class($a)."\n";
$b = new Sample\classB();
echo get_class($b)."\n";
Expected result:
----------------
Both (Test 1 & 2) should have the same output.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 16:00:02 2025 UTC |
Missed subnamespace declaration in test script: Sample\Subnamespace\classA.php: <?php namespace Sample\Subnamespace; class classA {}A similar simpler case: c.php: namespace B; use A\Item; b.php: namespace B; class Item {}; main.php: require 'b.php'; require 'c.php'; FATAL error main.php: require 'c.php'; require 'b.php'; No problem at all Our system worked fine but unexpectedly started crashing because someone declared a new class that suddenly caused a conflict in an included file elsewhere. Namespaces were supposed to just fix that problem. I would like that namespaces worked completely static and on a per unit level. The way it is designed suggests that it should work that way...