【问题标题】:Basic php class problem基本的php类问题
【发布时间】:2010-11-16 00:53:53
【问题描述】:

请耐心等待,因为我是 oop 新手! 是否可以将函数的结果分配给属性?
这可能没有意义,所以这就是我认为代码可能的样子!

Class b extends a 
{ 
    public $conn= $this->connect();

    public function operation() { ...}

}

connect() 是来自 a 类的函数,它连接到数据库并在成功时返回 $result

【问题讨论】:

    标签: php oop attributes class


    【解决方案1】:

    是的,这是可能的,但您需要使用constructor 之类的方法:

    Class b extends a { 
        public $conn;
        public function __construct() {
            $this->conn = $this->connect();
        }
        public function operation() { /* ... */ }
    }
    

    【讨论】:

    • 请看我的回答。这很危险,除非您的类无法派生或无法覆盖 connect 方法。
    【解决方案2】:

    您需要将连接调用放在方法中,然后在实例化类后调用该方法以初始化连接 - 或使用构造函数方法自动执行此操作。

    【讨论】:

      【解决方案3】:

      通常,这是一种不好的形式,因为您无法确定将调用 connect() 方法的哪个实现。它是来自当前类的那个还是来自超类的那个?事实上,如果 PHP 允许这样做,我会感到惊讶。

      初始化应该在构造函数中完成,但即便如此,它也取决于初始化所涉及的内容。如果需要调用其他方法,那么同样存在上述问题:调用哪个版本的方法?

      但是,对于您描述的场景,我既不会在声明时初始化成员变量,也不会在构造函数中初始化。相反,我会将$conn 传递给构造函数。这是依赖注入的基础。

      【讨论】:

      • PHP 允许这种功能。实际上,当B覆盖connect时,$conn会是Bconnect方法的返回值,如果不是,那么就是Aconnect 方法之一。
      • 自 2004 年以来我没有做过任何 PHP,所以我的立场是正确的。但是,我仍然认为从构造函数调用非最终方法是不好的形式,因为您不能保证派生类不会破坏您的构造函数并使您的类无效。原作者似乎想以此为捷径(使用方法继承避免重复代码),不好。我建议他将连接传递给构造函数(依赖注入),或者在构造函数中初始化变量而不调用非最终方法。
      【解决方案4】:

      我通常会这样做

      $link = mysql_connect(.....,......,......);
      
      Class b extends a { 
          public $conn;
          public function __construct($link) {
              $this->conn = $link;
          }
          public function operation() { /* ... */ }
      }
      $a = new b($link);
      

      然后,如果您的连接详细信息发生更改,您可以在一个地方更改它们,并且如果您需要连接到不同的服务器,您可以传递另一个链接变量。

      另一个 oop 数据库集成的技巧是始终拥有一个 DBable 基类来执行基本的 save() load() find() count() 等,使用 db 可保存对象更快

      BaseDBClass
         A
            B
            C
            D
         X
            Y
            Z
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多