2013-10-15 45 views
1

我有4类: Main SQL Template Member 。我想SQL TemplateMember延长Main类。 但同时,我希望能够不能同时调用所有的类都不需要它们。PHP多类延伸出的一个

因此,在我的index.php文件中,我会拨打MainTemplate
在我的register.php页面,我会打电话Main,Template, SQLMember
在我的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 ..

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

你能告诉我一个更好的方法吗? 预先感谢您。

+0

阅读http://php.net/manual/en/language.oop5.autoload.php –

回答

3

如果你真的需要在Main类的方法twothreefour没有实现它们你就必须使它抽象,迫使孩子的落实他们的所有(这是绝对可以接受的好方法做这样的事情)。

<?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"; 
    } 

} 

?> 

另一种选择是检查方法是否存在(不好/ hack /请参阅下面的注释)。

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

+0

因此,我应该在主要类中有所需的所有类功能,而其他类中的其他类功能,对吧? - 我实际上没有回显,我只是返回它,并且只在最终的PHP文件中回显一次。我只是在这个例子中做到了。感谢您的帮助 – user2271353

+0

我将答案扩展为包含一个示例子类。这很好,总是尝试在你的类中编写没有副作用(例如'echo','head()')。你需要某种入口点来回应你的输出,当然完全可以和必要的。我希望我的榜样对你有所帮助,否则不断问。 ;) – Fleshgrinder

+0

我有问题,宣布类抽象。您是否可以在Skype上添加我,并尝试通过TeamViewer查看问题?如果是这样,我的Skype是xG.WilliamSantos – user2271353

1

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

+0

你能指定如何实现它们(举一个例子)? - 我是新来的班级。 – user2271353

+0

在您的Main类中,定义名为Two,Three和Four的方法,但没有实现。例如。公共函数MethodName(){} –

+0

好的,但我需要从他们被覆盖的类中调用它们,对吧?当我从Main类调用函数'One'时,我希望它们被调用。 – user2271353

1

不要让这些类继承主类。 SQL,模板和成员没有很多共同之处。因为他们不应该扩大一个共同的类别Main,他们应该是自己的。普通的大师班会在以后变得更加复杂。

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

我的问题在于:我不能进入好的面向对象编程的全部内容,因为这样会填充书本,并且不会很适合Stackoverflow上的问题和答案格式。所以我只能建议你应该阅读更多关于主题的内容,并避免使用God object pattern

+0

谢谢你的回答。我如何“创建一个SQL对象并将其传递给'Member'对象? – user2271353

+0

'$ sql = new SQL; $ member = new Member($ sql);' - sql对象将被存储在内部,然后可以被需要数据库的成员的任何方法使用。 – Sven