我想了解使用的接口怎么给我,因为我一直在使用Google多重继承。
class A
{
function do1(){}
function do2(){}
function do3(){}
}
class B extends A
{
function do4(){}
function do5(){}
function do6(){}
}
class C extends B
{
}
在上面的例子中,类C具有所有从类A和B.然而,类B也有类A,这是没有必要的所需的所有方法的方法。
我的搜索想出了使用界面通过移动方式的一类,并创建接口,下面来解决这个问题。
interface A
{
function do1();
function do2();
function do3();
}
interface B
{
function do4();
function do5();
function do6();
}
class C implements A, B
{
function do1(){}
function do2(){}
function do3(){}
function do4(){}
function do5(){}
function do6(){}
}
我实在不明白这一点,因为所有的代码是在新的班级如何解决这个问题。 如果我只是想用A级最初,我会创建一个实现接口A和相同的代码复制到新类的新类。
是否有什么我失踪?
PHP没有多重继承。 如果你有PHP 5.4,不过,你可以使用特征至少无需复制代码每一个类。
interface A {
public function do1();
public function do2();
public function do3();
}
trait Alike {
public function do1() { }
public function do2() { }
public function do3() { }
}
interface B {
public function do4();
public function do5();
public function do6();
}
trait Blike {
public function do4() { }
public function do5() { }
public function do6() { }
}
class C implements A, B {
use Alike, Blike;
}
class D implements A {
use Alike;
// You can even "override" methods defined in a trait
public function do2() { }
}
但是请注意,你必须既实现接口和使用特征(或,当然,提供自己的实现)。 C和d是不是在所有相关的,除了在这两个实现A接口。 性状基本上只是解释级复制和粘贴,不影响继承。
要了解关于接口的第一件事是,他们没有用于继承。 这是理解一个非常重要的事情。 如果你试图让几个班共用同一个具体的代码,这不是一个接口是什么。
要了解的第二件事是客户端代码,服务代码之间的区别。
客户端代码实际上是在对数据的请求序列中的“最后一步”。 控制器或MVC的视图可以被认为是客户机代码。 该模型,同时可以考虑服务代码。
接口用于客户端代码执行的类型从服务中获取数据的一致性。 或者另一种方式来想想 - 接口的服务,以确保他们将与来自客户端代码的请求兼容的方式。 这就是他们做的。 他们毫不夸张地通过提供数据访问接口,而不是多个类可以共享的实现。
所以,给你一个具体的例子:
客户端代码-用户的论坛个人资料ProfileViewController类
class ProfileViewController
{
public function showProfile(User $user)
{
$user->getProfile();
}
}
服务代码-用户模型,检索数据并将其传递给请求它的客户端代码
class User
{
public function getProfile()
{
$profile = Do some SQL query here or something
return $profile;
}
}
在你决定用户分解成员,管理员,裁判员,主持人,作家,编辑等,而每个人都有自己独特的类型的配置文件后,现在假设。 (如自己的自定义查询,或数据,或者你有什么)
现在有两个问题,在座的:
- 你需要保证,不管你通过在那里将包含getProfile()方法。
- 如果你不是一个User对象以外的任何通过showProfile()会失败。
1易于通过抽象类和方法(或通过接口)来解决。 2,在第一听起来很容易为好,因为你可以使版主,管理员和会员用户基类的子类。
但是当在路上,除了用户配置文件,你想拥有的东西的通用配置文件会发生什么。 也许你想展现的竞技选手轮廓,甚至是名人的个人资料。 他们不是用户,但是他们仍然有谱/详细信息页面。
因为他们不是用户,它可能没有任何意义,认为这些用户的子类。
所以,现在你有点卡住了。 showProfile()需要能够接受的不仅仅是一个用户对象的更多。 其实,你不知道你会最终要在那里传递什么类型的对象。 但在同一时间,因为你总是希望能够抓住用户$> getProfile(),任何你传递必须有足够的通用传递中,并实施具体getProfile()方法。
解? 接口!!!!!
首先是一些服务代码
// First define an interface for ANY service object that will have a profile
interface IHasProfile
{
public function getProfile();
}
// Next, define the class for an object that should have a profile. I'll do a bunch for the sake of an example...
class User implements IHasProfile
{
public function getProfile()
{
$profile = Your unique user profile query here
return $profile;
}
}
class Celebrity implements IHasProfile
{
public function getProfile()
{
$profile = Your unique celebrity profile query here
return $profile;
}
}
class Car implements IHasProfile
{
public function getProfile()
{
$profile = Your unique vehicle profile query goes here
return $profile;
}
}
接下来,将使用它的客户端代码
class ProfileViewController
{
public function showProfile(IHasProfile $obj)
{
$obj->getProfile();
}
}
有你有它。 showProfile()现在已经被抽象不够,它并不关心什么反对它得到,只在乎对象具有公共getProfile()方法。 所以,现在你可以创建新的对象类型,以你的心脏的内容,如果他们的目的是拥有个人资料,你可以给他们“实现IHasProfile”,他们将自动只是showProfile工作()。
一个人为的例子的种类,但应说明至少接口的概念。
当然,你可能仅仅是“懒”,而不是强制转换对象可言的,因此允许任何物体在传递但是,这完全是一个独立的主题。)
多重继承可能只对接口!
如我的输出吧:
php > interface A{};
php > interface B{};
php > interface C extends A,B{};
php > class D implements C{};
php > $d = new D();
php > echo ($d instanceof A);
1
- 我创建甲乙接口和C接口扩展它们。
- 我们有d级之后实现C接口
- 最后,我问,如果$ d对象的instanceof A接口,是啊,是真的
对于lulz,我尝试创建延伸d和stdClass的类E级,并得到错误!
php > class E extends D, stdclass{};
PHP Parse error: syntax error, unexpected ',', expecting '{' in php shell code on line 1
Parse error: syntax error, unexpected ',', expecting '{' in php shell code on line 1
多重继承是不可能的PHP就像许多OOP
支持的语言
看到类似的主题在这里 。 主题是在AS3
但给你回答。
要特别回答有关解决在使用接口在同一职位回答这里
希望这可以帮助
至于说在这里通过@tonicospinelli,似乎确实是,PHP允许的接口多重继承 ,但它没有明确的解释,只是给出的例子
多重继承的工作方式,通过PHP使用这些特征实现接口 。
一旦宣告实施“多接口”一类 (1),可以使用已定义特征 ,以确保继承是公进行。
(1):说“多接口”我的意思是一类实施什么从多个其他接口延伸的接口