PHP,命名空间,使用和包含 - 简单的示例错误

时间:2016-04-07 08:35:50

标签: php namespaces include

我正在尝试理解名称空间并包含在PHP中,并提出了一个如下所示的示例:

$ tree test/class/
test/class/
├── Bar.php
└── testin.php

以下是我正在运行以设置示例的bash命令:

mkdir -p test/class

cat > test/class/Bar.php <<EOF
<?php
namespace Foo;
class Bar {
  function __construct() { // php 5 constructor
    print "In Bar constructor\n";
  }
  public function Bar() { // php 3,4 constructor
    echo "IT IS Bar\n";
  }
}
?>
EOF

cat > test/class/testin.php <<EOF
<?php
use Foo;
require_once (__DIR__ . '/Bar.php');
$bar = new Bar();
?>
EOF

pushd test/class
php testin.php
popd

当我跑步时,我得到:

+ php testin.php
PHP Warning:  The use statement with non-compound name 'Foo' has no effect in /tmp/test/class/testin.php on line 2
PHP Parse error:  syntax error, unexpected '=' in /tmp/test/class/testin.php on line 4

好的,我怎么能修改这个例子,所以它testin.php读取Bar.php中的类并用它来实例化一个对象,同时使用use和名称空间?

编辑:由于存在美元符号EOF,第二个文件设置应引用“$”:

cat > test/class/testin.php <<"EOF"
<?php
use Foo;
require_once (__DIR__ . '/Bar.php');
$bar = new Bar();
?>
EOF

...然后运行php脚本会出错:

+ php testin.php
PHP Warning:  The use statement with non-compound name 'Foo' has no effect in /tmp/test/class/testin.php on line 2
PHP Fatal error:  Class 'Bar' not found in /tmp/test/class/testin.php on line 4

EDIT2:如果我declare the full path, beginning with \ which signifies the root namespace,那么它有效:

cat > test/class/testin.php <<"EOF"
<?php
use \Foo;
require_once (__DIR__ . '/Bar.php');
$bar = new \Foo\Bar();
?>
EOF

......然后一切正常:

+ php testin.php
In Bar constructor

...但是,如果我在执行use时必须重复完整的命名空间路径,那么$bar = new \Foo\Bar();的重点是什么? (如果我没有明确写\Foo\Bar(),则无法找到类Bar ...)

1 个答案:

答案 0 :(得分:0)

如果您在testin.php文件中使用use Foo\Bar;,则可以直接使用$bar = new Bar();

如果您使用$bar = new Foo\Bar();,则无需添加use ...

因为use Foo只是意味着命名空间(在你的情况下它意味着文件夹'class'),如果你想要它对应一个指定的文件,你应该添加文件的名称。