Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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_Oop_Class_Inheritance - Fatal编程技术网

php类只继承一个方法

php类只继承一个方法,php,oop,class,inheritance,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-&g

我有以下课程:

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类完全相同


那么我如何才能让website类实现这个方法呢?但是只有getData()方法才能创建另一个只有getData方法的类,并使现有的两个类都扩展该新类。

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

继承形成一个类,但这不是继承的情况。您的
网站
用户
没有任何关系,因此它们之间不应该存在关系

像这里其他地方建议的那样,将很快导致整体式架构和。这些反过来又会导致死亡。同样,将所有内容公开或采用类似的方法来阻止信息隐藏和扩大公共API也会导致类似的问题,您希望避免这些问题

您正在寻找的是,但这些仅在PHP5.4中受支持。最简单的方法实际上就是在两个类中复制该方法。请记住,您通常希望避免代码重复,但在这种情况下,与其他建议的替代方案相比,它的危害较小


一个可行的替代方案是使用内省服务,该服务使用反射将数据从对象提取到数组中。虽然一般来说,.

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

为了解决真正的问题,如果您想控制传入和传出数据,应该查看公共属性,或者使用getter和setter的私有属性


但是,如果您认为您需要给定对象的所有属性(并且愿意接受诸如复制粘贴编程、traits等“hack”,为什么不简单地将它们标记为public并调用?

要使其类型保存,您可以定义一个接口,例如具有getData方法的“arrayserizable”。您可以稍后在TypeHitts中使用此接口,而不是在类中使用


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

如果您没有Traits,则可以使用旧的mixin实现

你可能知道:

<?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

-1因为拥有基类会打乱继承链,阻碍重用,并会很快导致God对象和单片体系结构。+1因为它不符合您的要求。这是唯一可行且可维护的解决方案。如果OP所说的是一段完全相同的代码,那么唯一值得投反对票的答案就是你的答案,@Gordon,因为你(是的,还有其他人)建议复制粘贴。不是dv,但我认为这是某种形式的数据映射。在这种情况下,可以使用COSTRUCT/getData接口或公共属性或反射。在我的书中,没有pulic属性是一个有效的选择:)@edorian如果它是某种数据访问层或模板层,那么从一种包含GetData方法的TemplateObject或DAOObject派生出来应该是一种方法。如果没有,我真的很想看看OP想要实现什么。通过一个方法返回所有对象的所有私有属性在我看来好像OP没有得到属性(或对象…)的用途,-1建议在OP确实只需要数组中的数据时添加getter/setter。您建议扩大公共API,而不是保持其小型化和集中化。除非该对象是一个值对象,否则您应该使用它。从DAO对象派生的@CodeCaster将是(或至少接近于)“活动记录”,并且与之相关的问题非常多(请参见RoR或Cake的问题),并且在大多数情况下被“数据映射器”超越。但这可能是一个有效的选择,而不是OP的选择:)@Gordon好吧,是的,OP问题的唯一有效答案是“使用特征”或“到处复制粘贴”,你是对的。不,等等,“使用适合GetData方法用途的基类”可能是一个非常明智的解决方案,也可以使用公共属性或getter和setter,这取决于OP想要实现什么。但我不止一次这样被打动。OP要求一些不太常见的东西(他可能最不需要,但无法解释他真正想要的东西),OP得到了答案,并生活在遗忘中。好吧,祝你好运。如果你目前在生产环境中使用php5.4,你就生活在边缘。这是一个RC,就像它在php.net上说的:“这是一个候选版本,不要在生产中使用它!”