我正在尝试理解名称空间并包含在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
...)
答案 0 :(得分:0)
如果您在testin.php文件中使用use Foo\Bar;
,则可以直接使用$bar = new Bar();
。
如果您使用$bar = new Foo\Bar();
,则无需添加use ...
因为use Foo
只是意味着命名空间(在你的情况下它意味着文件夹'class'),如果你想要它对应一个指定的文件,你应该添加文件的名称。