1

我有 4 节课: Main SQL Template Member . 我想SQL Template扩展 课程MemberMain但同时,我希望能够不调用所有类,也不需要同时要求它们。

所以,在我的index.php文件中,我会调用Mainand Template
在我的页面中,register.php我会调用Main,和. 在我的页面中,我会调用,和。TemplateSQLMember
submit.phpMainSQLMember

我有这样的课程:

------ 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

3 回答 3

3

如果你真的需要方法twothree并且four在你的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. 我现在可以告诉您很多关于该做什么和不做什么的事情,但我认为最好先了解更多有关面向对象的理论,然后再继续。:)

于 2013-10-15T22:08:06.687 回答
1

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

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

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

于 2013-10-15T23:08:45.760 回答
1

在 Main 类上实现 Two()、Three() 和 Four()。他们不必做任何事情。然后,您可以从 Main 中调用它们——它们将执行您调用 One() 的类的覆盖函数中实现的操作。

于 2013-10-15T22:00:50.020 回答