组合多个类在PHP中会出现错误吗?
我正在创建一个结构如下的网站:组合多个类在PHP中会出现错误吗?,php,class,Php,Class,我正在创建一个结构如下的网站: 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.
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
Martti Laine要从
user
内部的mysql
调用函数,可以在user
内部创建mysql
对象并调用函数
<?php
// this is user.php
$var = new mysql(); // <--if it takes parameters in the constructor
$var->method();
...
?>
为了得到更好的答案,您能否提供更多的信息,例如,您遇到了哪些错误
其思想是让这些类使用彼此的函数
这不是你要做的:继承只有一条路mysql
、user
和etc
继承main
的能力,但不继承彼此的能力
您可以使用mysql
extenduser
extendetc
,这样至少mysql
可以调用所有函数,但这可能没有意义,因为我认为它们不是祖先,而是兄弟姐妹,实现了截然不同的功能
<?php
// this is user.php
$var = new mysql(); // <--if it takes parameters in the constructor
$var->method();
...
?>
您必须在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()
或者,更复杂的是,使用依赖注入或单例模式。不久前我问过如何在PHP中处理这个问题,得到了很多反馈,也许这会给你一些启发。扩展类不是这样的。所有类中应该存在的所有函数都应该是main的一部分。然后特定于mysql的函数进入该类。我猜这些类在继承方面并不像你想象的那样紧密相连。如果用户类需要通过mysql类进行调用,请在用户类中设置一个包含mysql对象的变量。让一个类扩展另一个类可以使用另一个(父)类的方法。因此,
user
extensingmain
只使main
的方法对其可用。如果其他类扩展了main
,则不允许所有类都互相调用方法。您可以使用user
extendmysql
,然后mysql
的方法将可供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();
这里有一些关于依赖注入的好文章
特别是Symphony链接非常好地介绍了依赖项注入的概述以及如何设置依赖项容器。您知道类是什么吗?你以前用过吗?好吧,只要mysql是第一个加载的类,它就应该可以工作。。。你能写简单的代码吗?是的,我包括了包含这些类的文件,然后我调用它们并使用它们。当我试图在user中从mysql调用函数时,它会给我带来错误。让我们看看这些错误可能是个好主意……您(似乎)试图实现的结果是类之间的强依赖性。无论如何,至少有一个类将具有“is-a”关系,而您希望(最多)具有“has-a”关系。因为您的示例类是
user
和mysql
(在我看来,拥有一个定制的mysql类是另一个问题),所以即使依赖注入也可能太“强大”。看见