我正在创建一个结构如下的网站:
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
答案 0 :(得分:2)
这个想法是让这些类使用彼此的功能。
这不是你在做什么:继承只有一种方式。 mysql
,user
和etc
继承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链接特别是关于依赖注入概述以及如何设置依赖容器的非常好的阅读。