PHP 多个类扩展一个


PHP Multiple Classes Extending One

我有4个类: Main SQL Template Member.我想要SQL TemplateMember扩展Main类。但是,与此同时,我希望能够同时调用所有类,也不需要它们。

因此,在我的index.php文件中,我会调用MainTemplate
在我的register.php页面中,我会称MainTemplateSQLMember
在我的submit.php页面中,我会称MainSQLMember

我有这样的课程:

------ Main Class ------

<?php
public $db;
class Main {
    public function __construct(){
    }
    public function One(){
        // here I would call Two, Three, and Four if available
    }
}


------ SQL Class ------

<?php
class SQL extends Main {
    public function __construct(){
        parent::__construct();
        $this->db = new mysqli(....);
    }
    public function Two(){
        $this->db->query(.....);
        // Fetch query code
        echo $result;
    }
}


------ Template Class ------

<?php
class SQL extends Main {
    public function __construct(){
        parent::__construct();
        $this->db = new mysqli(....);
    }
    public function Three(){
        $this->db->query(.....);
        // Fetch query code
        echo $result;
    }
}


Member类将与其他类相同,并且具有函数四。

所以,这就是我的做法,但我无法从子类调用函数,只能从主类调用函数。

你能告诉我一个更好的方法吗?提前谢谢你。

如果你真的需要two的方法,threefour在你的Main类中而不实现它们,你必须让它抽象并强迫孩子实现所有这些方法(这是绝对可以接受的,也是做这样事情的好方法)。

<?php
abstract class Main {
  function fn1() {
    $this->fn2();
    $this->fn3();
  }
  abstract function fn2();
  abstract function fn3();
}
class Child extends Main {
  function fn2() {
    return "foo";
  }
  function fn3() {
    return "bar";
  }
}
?>

另一种选择是检查方法是否存在(不好/黑客/见下面的评论)。

<?php
class Main {
  function fn1() {
    if (method_exists($this, "fn2")) {
      $this->fn2();
    }
    if (method_exists($this, "fn3")) {
      $this->fn3();
    }
  }
  function fnDontRepeatYourself() {
    foreach (range(2,3) as $fn) {
      if (method_exists($this, $fn)) {
        $this->{$fn}();
      }
    }
  }
}
?>

第二种方法的问题在于,孩子们实际上并不知道他们必须实施这些方法,这是有问题的。

继承应该从一般到具体,你不应该在你的类中echo任何东西,而应该return。关于该做什么和不该做什么,我现在可以告诉你很多事情,但我认为在继续之前,你最好先学习更多关于面向对象的理论。:)

在主类上实现 Two()、Three() 和 Four()。他们不一定要做任何事情。然后,您可以从 Main 中调用它们 - 它们将执行在你调用 One() 的类上的覆盖函数中实现的内容。

不要让这些类继承主类.SQL、模板和成员没有太多共同点。因此,它们不应该扩展一个公共类Main,它们应该靠自己。普通的大师班会在以后使事情变得更加复杂。

存在多个类需要数据库访问的情况。这是作曲发挥作用的时候。Member类应该能够读取和写入数据库 - 您应该创建一个SQL对象并将其传递到Member对象中。这同样适用于Template类,如果模板也存储在数据库中。

我的问题是:我无法深入到好的面向对象编程的全部内容,因为这会填满书籍,并且不适合Stackoverflow上的问答格式。所以我只能建议你应该阅读更多关于这个主题的东西,避免上帝的对象模式。