класс php для наследования только одного метода - PullRequest
1 голос
/ 06 декабря 2011

У меня есть эти классы:

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"];
        ...
    }
}

Метод getData () в User точно такой же, как и для класса Website.

, так как я могу получить класс сайта для реализации этогометод?Но ТОЛЬКО метод getData ()

Ответы [ 6 ]

2 голосов
/ 06 декабря 2011

В то время как наследование формирует ведет себя как отношение , это не ситуация для Наследования.Ваш Website никак не связан с User, поэтому между ними не должно быть никаких отношений.

Наличие базовых классов , как предлагается в другом месте, быстро приведет к монолитной архитектуре и объектам бога .Это, в свою очередь, приводит к снижению ремонтопригодности, высокой связности, хрупкому коду и затрудняет повторное использование .Аналогичным образом, обнародование всего или использование аналогичных средств означает, что уничтожение сокрытия информации и расширение общедоступного API приводят к аналогичным проблемам, и вы захотите их избежать.

То, что вы ищете, это Traits, но они поддерживаются только в PHP 5.4.Самый простой подход - просто дублировать этот метод в обоих классах.Имейте в виду, что вы обычно хотите избежать дублирования кода, но в этом случае это меньшее зло по сравнению с другими предлагаемыми альтернативами.

Жизнеспособной альтернативой будет использование службы самоанализа, которая использует Reflection для извлечения данных изобъект в массив.Хотя в целом вы должны помещать методы в объекты, имеющие данные, с которыми работают эти методы .

2 голосов
/ 06 декабря 2011

если вы используете php5.4, вы можете использовать черты вместо классов.Это решает случаи, когда вам нужно реализовать один метод в двух разных классах.

1 голос
/ 06 декабря 2011

Для сохранения типа вы можете определить интерфейс, например "arraySerializable", который имеет метод getData.Вы можете использовать этот интерфейс позже в TypeHints вместо класса.

Но это все еще не дает вам функциональности.Я предполагаю, что общий базовый класс - это не то, что вам здесь нужно.Поэтому, если вы не можете использовать черты, вы должны продублировать код.Это может быть одним из тех редких случаев, когда в некоторых строках дублируется код.

0 голосов
/ 18 мая 2012

Если у вас нет черт, существовала более старая реализация 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.?>

0 голосов
/ 06 декабря 2011

В отличие от других отвечающих, я думаю, что я должен прокомментировать ваш дизайн.Вы хотите создать метод, который предоставляет все частные свойства любого объекта.В большинстве случаев объект представляет собой нечто большее, чем просто пакет свойств, поэтому в каких ситуациях вам нужно знать все свойства?И почему вы тогда помечаете их как частные?

Чтобы решить реальную проблему, вы должны взглянуть на общедоступные свойства или частные с геттерами и сеттерами, если вы хотите контролировать входящие и исходящие данные.

Если, однако, вы считаете, что вам нужны все свойства данного объекта (и вы готовы принять «хаки», такие как копирование-программирование, черты и еще много чего), почему бы просто не пометить их как публичные и вызвать get_object_vars()

0 голосов
/ 06 декабря 2011

Создайте другой класс, который имеет только метод getData, и заставьте оба ваших существующих класса расширить этот новый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...