我有4节课:
Main
SQL
Template
Member
。我想SQL
Template
和
Member
延长Main
课程。
但是,与此同时,我希望不能同时召集所有课程,而不是同时要求所有课程。
因此,在我的index.php
文件中,我会调用Main
和Template
。
在我的register.php
页面中,我会拨打Main
,Template
,SQL
和Member
。
在我的submit.php
页面,我会致电Main
,SQL
和Member
。
我有这样的课:
------ 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函数调用。
请告诉我一个更好的方法吗? 提前谢谢。
答案 0 :(得分:3)
如果您确实需要two
课程中three
,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
。现在我可以告诉你很多关于做什么和不做什么的事情,但我认为最好先继续学习更多关于面向对象理论的知识。 :)
答案 1 :(得分:1)
在Main类上实现Two(),Three()和Four()。他们不一定要做任何事情。然后,您可以在Main中调用它们 - 它们将执行在您调用One()的类上的重写函数中实现的内容。
答案 2 :(得分:1)
不要让这些类继承主类。 SQL,模板和成员没有太多共同之处。因此,他们不应该扩展一个共同的班级Main
,他们应该独立。通用的大师班会在以后使事情变得更复杂。
有一种情况是多个类需要数据库访问。这是组合发挥作用的时候。 Member
类应该能够读取和写入数据库 - 您应该创建一个SQL
对象并将其传递给Member
对象。如果模板也存储在数据库中,则同样适用于Template
类。
我的问题是:我不能进入良好的面向对象编程的整个过程,因为这会填满书籍,并且不适合Stackoverflow上的问答格式。所以我只能建议您阅读有关该主题的更多内容并避免使用God object pattern。