组合多个类会给我带来PHP错误吗?

时间:2010-04-05 17:40:56

标签: php class

我正在创建一个结构如下的网站:

class main { }

class mysql extends main { }

class user extends main { }

class etc extends main { }

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

修改 所有错误都与此类似:

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

Martti Laine

4 个答案:

答案 0 :(得分:2)

  

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

这不是你在做什么:继承只有一种方式。 mysqluseretc继承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 :(得分:1)

要从mysql内的user调用某个函数,您可以在mysql内创建一个user对象并调用该函数。

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

为了获得更好的答案,您可以提供更多信息,例如,您遇到了哪些错误?

答案 2 :(得分:1)

这不是扩展课程的方式。应该存在于所有类中的所有函数都应该是main的一部分。然后,特定于mysql的函数进入该类。我猜测这些类在继承方面并没有你想象的那么紧密。如果用户类需要通过mysql类进行调用,则在包含mysql对象的用户类中有一个变量。

答案 3 :(得分:1)

让一个类扩展另一个使得另一个(父)的方法可用。因此,user扩展main只会使main的方法可用。如果其他类扩展main,则不允许所有类都调用彼此的方法。您可以user扩展mysql,然后mysql user的方法可用于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(); 尽管我不相信这基本上就是你的意思寻找

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

例如,如果您希望您的用户类可以访问您的mysql类,则可以在其构造函数中传递它的实例。

{{1}}

这里有一些关于依赖注入的好读物。

Symphony链接特别是关于依赖注入概述以及如何设置依赖容器的非常好的阅读。