2010-04-05 38 views
2

我创建与结构的网站是这样的:结合多个类给我在PHP中的错误?

class main { } 

class mysql extends main { } 

class user extends main { } 

class etc extends main { } 

的想法是让这些类使用功能彼此。这不起作用。如何在user中调用mysql的函数?

编辑: 所有的错误都与此类似:

Fatal error: Call to undefined method user::function_in_mysql() in C:\foo.php on line 8 

马尔蒂·莱恩

+3

你知道哪些类是?你有没有使用过它们? – 2010-04-05 17:44:01

+0

好吧,它应该工作只要mysql是第一类加载... 你可以写简单的代码? – confiq 2010-04-05 17:44:50

+0

是的,我包括包含这些类的文件,然后我打电话给他们并使用它们。当我尝试从用户的mysql调用函数时,它给了我错误。 – 2010-04-05 17:46:06

回答

1

让一个类扩展另一个类可以使其他父类的方法可用。所以user延伸main只能使main的方法可用。如果其他类扩展main它不允许它们全部调用其他方法。你可以有user延伸mysqlmysql的方法,然后将提供user虽然我不相信这从根本上这是你正在寻找

我认为你正在寻找的东西沿依赖注入的线,而不是类继承。

例如,如果你想让你的用户类访问你的mysql类,你可以在它的构造函数中传递它的一个实例。

class user { 
    protected $_mysql; 

    public function __construct(mysql $mysql) { 
     $this->_mysql = $mysql; 
    } 

    public function myMethod() { 
     $this->_mysql->myMysqlMethod(); 
    } 
} 

$mysql = new mysql(); 
$user = new user($mysql); 

$user->myMethod(); 

下面是关于依赖注入的一些很好的解读。

特别是交响乐的链接是依赖注入,以及如何建立一个依赖容器的概述一个相当不错的读取。

1

mysql调用函数的user里面,你可以的user和调用内部创建一个mysql对象功能。

<?php 
// this is user.php 
$var = new mysql(); // <--if it takes parameters in the constructor 
$var->method(); 
... 
?> 

为了得到更好的答案,你能否提供更多的信息,比如,你得到了哪些错误?

2

想法是让这些类使用彼此的功能。

这不是你在做什么:继承只有一种方法。 mysql,useretc继承了main的能力,但不是彼此的能力。

你可以有mysql延长user延长etc这样至少mysql可以调用所有功能,但可能不会是有意义的,因为我认为他们不是祖先,但兄弟姐妹对方,履行一个明显不同功能。

你将不得不要么定义main任何共享的方法 - 引进类对方所以他们能够互相调用的功能 - 经常去的最佳途径。你可以,例如,作为参数添加每个需要的类的实例构造函数:

$etc = new etc(); 
$mysql = new mysql($etc); 

// mysql's constructor sets $this->etc 
// so that it can call etc's functions using $this->etc->function() 

,或者更复杂的,使用依赖注入或单模式。前段时间我问了a related question关于如何在PHP中处理这个问题,并得到了很多反馈,也许它给了你一些启发。

1

这不是如何扩展一个类的作品。所有类中应该存在的所有功能应该是主要的一部分。然后,特定于mysql的函数将进入该类。我猜测这些类在继承方面并没有像你想象的那样紧密联系在一起。如果用户类需要通过您的mysql类进行调用,请在用户类中包含一个包含mysql对象的变量。