PHP命名空间 - 在不扩展扩展类的情况下扩展类

时间:2014-05-02 08:50:34

标签: php namespaces

我们正在寻求构建一个具有核心类的系统,并且能够扩展这些核心类,并且正在寻找使用命名空间。

我们遇到的问题是如果我们可以扩展扩展类而不扩展它扩展的类

例如,如果我们有文件夹和文件,如下所示

shared/classes/Entity.php
shared/classes/DatabaseEntity.php - Extends Entity.php
shared/classes/User.php - Extends DatabaseEntity.php

classes/ - Holds classes which extend from the shared classes

如果我们想在不创建自定义User类的情况下创建自定义DatabaseEntity类,这可能吗?

我理解这一点的方法是,User类将在共享命名空间中查找以扩展DatabaseEntity类,但是当我们扩展了DatabaseEntity类时,它需要查看顶级类目录

shared / classes / User.php

的示例
namespace shared;

class User extends DatabaseEntity {

}

shared / classes / DatabaseEntity.php

的示例
namespace shared;

abstract class DatabaseEntity extends Entity {

}

classes / DatabaseEntity.php

的示例
namespace custom;

use shared\classes\Entity;

abstract class DatabaseEntity extends Entity {

    //Some custom functionality to extend shared/DatabaseEntity

}

因此,如果我们不想将User类更改为

use custom/DatabaseEntity

那可能吗?

希望这是有道理的

提前感谢您提供任何帮助

3 个答案:

答案 0 :(得分:0)

我不知道我是否理解你,但你想创建将扩展DatabaseEntity的CustomDatabaseEntity类,而你不希望CustomDatabaseEntity扩展User类。

这当然是可能的。您可以根据需要创建任意数量的子类。由于User类定义为扩展DatabaseEntity类,因此甚至不知道您创建了CustomDatabaseEntity

答案 1 :(得分:0)

我也认为你使用它有点不对劲。如果DatabaseEntity与数据库有共同之处,而不是User本身,则应该创建Interface DatabaseEntityInterface,这两个DatabaseEntity类应该实现接口

然后在User类中,您应该将其作为构造函数参数传递

class User {
  protected $dbi;

  public function _construct(DatabaseEntityInterface $dbi) {
      $this->dbi = $dbi
  }
} 

以后您可以将共享文件夹的类或类

中的类传递给User类

答案 2 :(得分:0)

如果您不想添加到用户类

use custom/DatabaseEntity

并且您想要扩展custom / DatabaseEntity

您可以从

更改课程声明
namespace shared;

class User extends DatabaseEntity {

}

namespace shared;

class User extends \custom\DatabaseEntity {

}

如果你想扩展\ custom \ DatabaseEntity。

如果它不想让你想要实现我无法理解你的问题 - 你会问两个问题。

你问了

  

如果我们想在不创建的情况下创建自定义DatabaseEntity类   自定义User类,这可能吗?

答案是 - 是的,你刚刚在你的例子中创建了它。您创建了自定义DatabaseEntity类,但未创建自定义User类。

但如果你想实现:

  

需要查看顶级类目录

您需要告诉User类扩展特定的类 - 因此您需要使用使用和创建别名来使用完全限定的类或导入命名空间进行扩展