【问题标题】:PHP - Is this good require_once or extendsPHP - 这是好的require_once还是扩展
【发布时间】:2014-10-01 05:59:24
【问题描述】:

我是 php 的新手,但我会尝试直截了当。 我有一个名为 ConnectionManager 的类

class ConnectionManager
{
     function ConnectToDB()
     {
         //PDO connection code  
     }
}

在我的另一个经理 InstitutManager 中,我使用 require_once($filename) 来访问我的 ConnectionManager 功能

require_once('../manager/ConnectionManager.php');
class InstitutManager
{
     protected $connInstance;

     function _construct()
     {
         $this->connInstance = new ConnectionManager;
     }

     function getInstituts()
     {
         $conn = $connManager->ConnectToDb();
         //retrieve instituts 
     }
}

问题是:我应该在 InstitutManager 中使用 extends ConnectionManager 而不是 require_once 吗?为什么我应该多用一个?

谢谢

编辑:更改 InstitutManager 类的代码

这样可以吗?或者我应该在function _construct($conn) 中实例化我的连接的情况下传递一个参数?

【问题讨论】:

  • 如果你要扩展一个类,你仍然需要包含那个文件(有定义)
  • require 与extends 非常不同......它们的用途完全不同,即使您扩展,您仍然需要ConnectionManager.php 文件
  • 您的代码也确实会更好地在 InstitutManager 构造函数中为 ConnectionManager 设置一个类属性,而不是需要为每个需要它的方法实例化一个新的 ConnectionManager
  • 如果 InstitutManager 中的功能是 ConnectionManager 中功能的本地扩展,那么您可以说 IM 扩展了 CM。但是,如果 CM 只是一个通用数据库类,IM 不会扩展它,因为它们是互斥的类,而且 IM 使用 CM 但不会扩展它的功能。只需要求它并像您一样启动一个新实例是正确的。

标签: php oop extends require-once


【解决方案1】:

您的 include_once 读入一个源文件,在这种情况下,该文件中有一个 ConnectionManager 的类定义。您的扩展将类 InstitutManager 设置为继承类 ConnectionManager,即 InstitutManager 获取 ConnectionManager 中的所有内容,然后可以定义自己对该基本结构的修改。这两个操作之间根本没有任何关系,您的 $connManager = new ConnectionManager 操作是无意义的。

【讨论】:

  • 它们一点也不荒谬。对于这样的类来说,使用数据库类进行数据源抽象是一种常见的做法——他如何在不启动新的连接实例的情况下检索他的数据?
  • @scrowler 依赖注入?
  • @scrowler - 如果必须在脚本中多次调用 getInstituts() 方法,或者如果 InstitutManager 中的其他方法使用类似的代码并且还需要 ConnectionManager,那么这是无稽之谈,因为那时它需要在每次需要时实例化一个新的ConnectionManager....使用 DI 和类属性意味着 ConnectionManager 只需要实例化一次,无论对使用它的方法进行了多少次调用跨度>
  • 完全同意,并且在再次创建它之前应该完全存储并检查它是否存在 - 我只是认为这是一个概念上的示例 - 从概念上讲,如果一个类需要访问 DB 类并且没有'还没有实例化它,它将像他的示例一样创建
  • 编辑了问题。感谢您迄今为止的投入,非常感谢。
【解决方案2】:

require_once 'file'.php' 仅表示 PHP 解释器将获取名为 file.php 的文件的内容并将其转储到调用 include 的位置。有点像如果您选择 Word 文件中的所有内容,单击复制并将其粘贴到另一个 Word 文件的顶部会发生什么。

在您的情况下,您需要包含该文件,否则它将不知道在哪里可以找到 ConnectionManager 类。

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 2018-08-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多