PHP多个类扩展一个

时间:2013-10-15 21:56:05

标签: php class extend

我有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类与其他类相同,功能为4 ..

所以,这就是我这样做的方式,但是我无法从子类中调用函数,只能从main函数调用。

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

3 个答案:

答案 0 :(得分:3)

如果您确实需要two课程中threefourMain的方法而不实施它们,则必须将其抽象化并强制孩子们使用实施所有(这绝对是可以接受的,这是一种很好的做法)。

<?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。现在我可以告诉你很多关于做什么和不做什么的事情,但我认为最好先继续学习更多关于面向对象理论的知识。 :)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

不要让这些类继承主类。 SQL,模板和成员没有太多共同之处。因此,他们不应该扩展一个共同的班级Main,他们应该独立。通用的大师班会在以后使事情变得更复杂。

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

我的问题是:我不能进入良好的面向对象编程的整个过程,因为这会填满书籍,并且不适合Stackoverflow上的问答格式。所以我只能建议您阅读有关该主题的更多内容并避免使用God object pattern