Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组合多个类在PHP中会出现错误吗?_Php_Class - Fatal编程技术网

组合多个类在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
extend
user
extend
etc
,这样至少
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
extensing
main
只使
main
的方法对其可用。如果其他类扩展了
main
,则不允许所有类都互相调用方法。您可以使用
user
extend
mysql
,然后
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类是另一个问题),所以即使依赖注入也可能太“强大”。看见