php类只继承一个方法

时间:2011-12-06 09:17:54

标签: php oop class inheritance

我有这些课程:

class User{
    private $user_ID;
    private $first_name;
    private $surname;
    ...

    private $website;
    private $company;

    function __construct($array){
        $this->user_ID            = $array["userId"];
        $this->first_name         = $array["first"];
        $this->surname            = $array["last"];
        $this->telephone          = $array["tele"];
        ...
    }
    public function addWebsite($array){
        $this->website = $array;
    }
    public function addCompany($array){
        $this->company = $array;
    }
    public function getData(){
        $array = array();
        foreach($this as $var => $value) {
            $array[$var] = $value;
        }
        return $array;
    }
}

class Website{
    private $webId;
    private $url;
    private $description;
    ...

    function __contruct($array){
        $this->webId           = $array["webId"];
        $this->url             = $array["url"];
        $this->description     = $array["desc"];
        ...
    }
}

User中的getData()方法与Website类完全相同。

那么如何让网站类实现这个方法呢?但只有getData()方法

6 个答案:

答案 0 :(得分:2)

如果您使用的是php5.4,则可以使用特征而不是类。它解决了你需要在两个不同类中实现一个方法的情况。

答案 1 :(得分:2)

虽然继承形成behaves-as relationship,但这不是继承的情况。您的Website以任何方式与User无关,因此它们之间不应存在关联。

在此处其他地方建议使用base classes会很快导致单片架构和god objects。那些反过来导致less maintainability, high coupling, fragile code and hampers reuse。同样地,将所有内容公之于众或诉诸于类似意味着破坏信息隐藏和扩大公共API会导致类似的问题,并且您将希望避免它们。

您正在寻找的是Traits,但这些仅在PHP 5.4中受支持。最简单的方法就是在两个类中复制该方法。请记住,您通常希望避免代码重复,但在这种情况下,它比其他建议的替代方案更为邪恶。

一种可行的替代方法是使用Introspection Service,它使用Reflection将对象中的数据提取到数组中。虽然通常是you should put methods on the objects having the data the methods operate on

答案 2 :(得分:1)

要使其成为类型保存,您可以定义一个接口,例如“arraySerializable”,它具有getData方法。您可以稍后在TypeHints中使用此界面,而不是类。

但是这仍然没有给你功能。我想一个共同的基类不是你想要的东西。因此,如果您不能使用特征,则必须复制代码。这可能是一些极少数情况下,某些行重复代码就可以了。

答案 3 :(得分:0)

创建另一个只有getData方法的类,并使两个现有类扩展该新类。

答案 4 :(得分:0)

如果您没有Traits,可以使用较旧的Mixins实现。

您可能知道:

<?php

class A {
    public function B() {
        var_dump($this->data);
    }
}
class X {
    protected $data;
    public function Y() {
        A::B()
    }
}

$x = new X;
$x->Y(); // will execute the code for A::B 
         // but will assume the object context
         // of $x (of class X) and will have
         // access to $this->data
         // ! this is not a static call

使用此原则,您可以创建一个类名称和/或方法名称的静态数组,您可以通过魔术方法__get“混合”或“使用”(如特征)。     ?&GT;

答案 5 :(得分:-2)

与其他回答者相反,我认为我应该评论你的设计。您想要创建一个公开任何对象的所有私有属性的方法。在大多数情况下,对象不仅仅是一个属性包,所以在什么情况下你需要知道所有属性?那你为什么把它们标记为私人?

要解决实际问题,您应该查看公共属性,或者如果要控制传入和传出数据,请查看具有getter和setter的私有属性。

如果你认为你需要给定对象的所有属性(并且愿意接受像乱码编程,特征和诸如此类的“hacks”),为什么不简单地将它们标记为公共并调用get_object_vars()?< / p>