在PHP文件中包含类

时间:2019-01-27 08:07:14

标签: php oop

假设我有一个简单的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 ...类限制为 ,以便另一个类可以再次使用该名称?我怀疑该解决方案将与命名空间有关,尽管我所做的研究表明这仅对不同目录中的文件有用。提前谢谢!

2 个答案:

答案 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-1PSR-4,它们尤其要求每个类在其自己的单独文件中,它们的名称与类名(加上后缀.php),并属于某种以某种方式与其文件系统路径相对应的名称空间(尽管PSR-4确实允许如何映射名称空间名称有一些变化)文件系统路径)。

如果遵循这些建议,您就不会首先遇到这个问题,因为您的两个Foo类自然属于不同的名称空间,因此不会发生冲突。

答案 1 :(得分:1)

您不能回收类名,但是可以通过扩展和覆盖公共或受保护的方法和属性来覆盖类定义。

通过使用名称空间,您基本上只是在扩展类名称,因此通过更改名称空间的一部分可以确保类名称保持唯一。