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环境,谁能帮我试下?多谢多谢!
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环境,谁能帮我试下?多谢多谢!
应该是你是用的PHP还没有完全兼容namespace,
再等等稳定版出来之后用吧。
你的你的文章我看到过,恕我愚钝,文章中的意思,是指都要加前缀吧。您能否举个能实际运行起来的,并且可以实现无前缀的例子?多谢比如:
use foo;
bar(); // 等于在调用 foo\bar()
定义名字空间时,需要注意的地方是 namespace定义必须在脚本文件的顶部声明(同一脚本文件可以申明多个名字空间,但第一个申明必须在脚本文件的头部,)
例如
唯一能在namespace前的例外是控制结构中的declare和不起任何作用的原子语句
<?php
declare(encoding='GB2312');
namespace test;
?>
<?php
1;
namespace test;
?> 你在命名空间之前介入了include语句.自然是不被允许的.
<?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时不是一样的?
若是多个程序都include同一个名字空间的定义,那不就乱套了吗.
涉及两个定义了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有什么区别?
/* 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是三种调用方式,请注意最后一种,我没有运行成功。
include './Foo.php';
use \Foo;
\Foo\bar();
就我手上的版本 5.3 b2和6.0来说,namespaces都不被include带入引用的文件.
IBM上那个例子确实是报错.
use Foo后并没有实际生效.使用时仍然需要按全命字空间路径才能正常访问,或者给一个别名访问.
我怀疑这是一个BUG.再试试,等下过来回贴 . 但use像use \ArrayObject;后又正常.