我有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
类将与其他类相同,并且具有函数四。
所以,这就是我的做法,但我无法从子类调用函数,只能从主类调用函数。
你能告诉我一个更好的方法吗?提前谢谢你。
如果你真的需要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
。关于该做什么和不该做什么,我现在可以告诉你很多事情,但我认为在继续之前,你最好先学习更多关于面向对象的理论。:)
在主类上实现 Two()、Three() 和 Four()。他们不一定要做任何事情。然后,您可以从 Main 中调用它们 - 它们将执行在你调用 One() 的类上的覆盖函数中实现的内容。
不要让这些类继承主类.SQL、模板和成员没有太多共同点。因此,它们不应该扩展一个公共类Main
,它们应该靠自己。普通的大师班会在以后使事情变得更加复杂。
存在多个类需要数据库访问的情况。这是作曲发挥作用的时候。Member
类应该能够读取和写入数据库 - 您应该创建一个SQL
对象并将其传递到Member
对象中。这同样适用于Template
类,如果模板也存储在数据库中。
我的问题是:我无法深入到好的面向对象编程的全部内容,因为这会填满书籍,并且不适合Stackoverflow上的问答格式。所以我只能建议你应该阅读更多关于这个主题的东西,避免上帝的对象模式。