ibm上的文章:
http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new3/index.html上面有个例子是这样的:
定义命名空间:
 
<?php
    /* Foo.php */
    namespace Foo;
    function bar() 
    {
        echo "calling bar....";
    }
调用命名空间:
 
<?php 
    /* File3.php */
    include './Foo.php'; 
    use Foo; // 请注意这行和下一行!
    bar(); // outputs "calling bar...."; 请大家看调用命名空间的那块:
use Foo; // 我这样写会报:Warning: The use statement with non-compound name 'Foo' has no effect in
bar();按文章上写的,use Foo后再调用命名空间下的类或函数,就不用再加前缀,可我下载了php5.3.0beta1(windows版,我确认安装正确),怎么试,都试不出这种效果,必须得加前缀,如:Foo/bar(),我接触过其它语言,我认为理论上应该是use xxx后可以不用加前缀的,要是仍然要加,那和不用命名空间还有什么区别。ibm上的这篇文章也不算老,怎么会这样呢,还是windows版的php5.3还不行,我没linux环境,谁能帮我试下?多谢多谢!

解决方案 »

  1.   

    http://blog.csdn.net/syu/archive/2008/12/18/3543591.aspx我文章里写有.注意命名空间的位置那一段.
      

  2.   


    应该是你是用的PHP还没有完全兼容namespace,
    再等等稳定版出来之后用吧。
      

  3.   


    你的你的文章我看到过,恕我愚钝,文章中的意思,是指都要加前缀吧。您能否举个能实际运行起来的,并且可以实现无前缀的例子?多谢比如:
    use foo;
    bar(); // 等于在调用 foo\bar()
      

  4.   

    我文章里写了
    定义名字空间时,需要注意的地方是 namespace定义必须在脚本文件的顶部声明(同一脚本文件可以申明多个名字空间,但第一个申明必须在脚本文件的头部,)
     例如
     
    唯一能在namespace前的例外是控制结构中的declare和不起任何作用的原子语句
    <?php 
    declare(encoding='GB2312'); 
    namespace test; 
    ?> 
    <?php 
    1; 
    namespace test; 
    ?> 你在命名空间之前介入了include语句.自然是不被允许的.
      

  5.   

    这样是行的:
    <?php 
    namespace foo; 
    function hello() 

        echo 'hello from the foo namespace!';
    } use foo; 
    hello(); // outputs 'hello from the foo namespace!' 
    这样就不行了:<?php
    include './foo.php'; //就是定义namespace foo function hello()这段use foo; hello(); // outputs 'hello from the foo namespace!' 这是为什么呢?要是include进来的文件,每次都要加上namespace前缀,不是很麻烦,和没有namespace时不是一样的?
      

  6.   

    名字空间是个特殊的定义.
    若是多个程序都include同一个名字空间的定义,那不就乱套了吗.
      

  7.   

    比如模拟这么一种比较常见的情况,我要上传一个文件,并写入数据库。
    涉及两个定义了namespace的文件:
    1.file.php (namespace为file 其中有个函数是 upload)
    2.db.php (namespace为db 其中有个函数叫 insertTable)那么我的代码index.php这么写,就会报错:<?php
    include('file.php');
    include('db.php');//我先上传文件
    use file;
    // 根据ibm和网上大部份的文章,下面这句可以不加前缀,但实际不行
    // 即可以不用这样写 $result = file\upload($fileName);
    $result = upload($fileName);//然后我将结果写入数据库
    use db;
    insertTable($result);=============================大家看下上面的代码,理论上这样才能发挥命名空间的作用吧?
    首先,我用外部含有命名空间的组件,我肯定得include吧;
    其次,要是每次用某个命名空间下的函数或类,都要写全namespace的结构,比如每次都要写xxx\xxx\xxx\xxx()这样不是很累,跟没用namespace有什么区别?
      

  8.   

    跟我上面那帖,要是命名空间重复,可以这样吧:比如两个第三方组件,都叫aaa的namespaceuse aaa as bbb;use aaa as ccc;
      

  9.   

    或者回归最简单的问题,像IBM那篇文章上的例子:
    /* Foo.php */ 
    <?php 
    namespace Foo; 
    function bar() 

        echo "calling bar....";

    ?> /* File1.php */ 
    <?php 
    include './Foo.php'; 
    Foo/bar(); // outputs "calling bar...."; 
    ?> /* File2.php */ 
    <?php 
    include './Foo.php';
    use Foo as ns; 
    ns/bar(); // outputs "calling bar...."; 
    ?> /* File3.php */ 
    <?php 
    include './Foo.php'; 
    use Foo; 
    bar(); // outputs "calling bar...."; 
    ?> 
    上面定义了一个namespace Foo,file1-3是三种调用方式,请注意最后一种,我没有运行成功。
      

  10.   

    <?php 
    include './Foo.php'; 
    use \Foo; 
    \Foo\bar();
      

  11.   

    你这个问题,我刚刚试了一下.
    就我手上的版本 5.3 b2和6.0来说,namespaces都不被include带入引用的文件.
    IBM上那个例子确实是报错.
    use Foo后并没有实际生效.使用时仍然需要按全命字空间路径才能正常访问,或者给一个别名访问.
    我怀疑这是一个BUG.再试试,等下过来回贴 . 但use像use \ArrayObject;后又正常.