假设我有一个简单的PHP文件,如下所示:
Send on all alerts
Include image
现在,假设我想在单独的文件中使用FooBar.php(在此示例中,位于同一目录中),但我也想允许将另一个类命名为“ Foo”
FooBar.php
class Foo { // Helper class for FooBar
function toString() {
echo "Foo!<br>"
}
}
class FooBar {
public $foo;
function __construct() {
$this->foo = new Foo();
}
}
index.php
include("FooBar.php");
class Foo { // a new Foo object
function toString() {
echo "Foo #2!<br>";
}
}
$foobar = new FooBar();
// Let's say I call 'toString()' ...
$foobar->foo->toString();
"Foo!"
是否可以将"Foo#2!"
中的Cannot declare class Foo, because the name is already in use in ...
类限制为 ,以便另一个类可以再次使用该名称?我怀疑该解决方案将与命名空间有关,尽管我所做的研究表明这仅对不同目录中的文件有用。提前谢谢!
答案 0 :(得分:2)
PHP namespaces不需要 要求您将文件放在不同的目录中,即使它们的语法有点像文件系统路径。例如,这很好用:
FooBar.php:
<?php
namespace MyNamespace;
class Foo { // Helper class for FooBar
function toString() {
return "Foo!";
}
}
class FooBar {
public $foo;
function __construct() {
$this->foo = new Foo();
}
}
index.php :
<?php
include("FooBar.php");
use MyNamespace\FooBar;
class Foo { // a new Foo object
function toString() {
return "Foo #2!";
}
}
$foobar = new FooBar();
$foo = new Foo();
echo $foobar->foo->toString(), "\n";
echo $foo->toString(), "\n";
将以上两个文件都放在当前目录中,在命令行上运行php index.php
将会打印:
Foo!
Foo #2!
但是,您可能应该遵循PHP Standards Recommendations,尤其是PSR-1和PSR-4,它们尤其要求每个类在其自己的单独文件中,它们的名称与类名(加上后缀.php
),并属于某种以某种方式与其文件系统路径相对应的名称空间(尽管PSR-4确实允许如何映射名称空间名称有一些变化)文件系统路径)。
如果遵循这些建议,您就不会首先遇到这个问题,因为您的两个Foo
类自然属于不同的名称空间,因此不会发生冲突。
答案 1 :(得分:1)
您不能回收类名,但是可以通过扩展和覆盖公共或受保护的方法和属性来覆盖类定义。
通过使用名称空间,您基本上只是在扩展类名称,因此通过更改名称空间的一部分可以确保类名称保持唯一。