2012-02-08 4 views
0

У меня есть таблица MySQL, в которой хранятся люди и компании. У них одинаковые поля. В php у меня естьШаблон проектирования для создания экземпляров объектов дочерних классов

class User{ 
var $_id; 
var $_data; 
function loadDataFromDb() 
{ 
} 
} 

class Company extends User 
{ 
    function getName() 
    { 
    //some implemantation 
    } 
} 


class People extends User 
{ 
function getName() 
{ 
//some implemantation 
} 
} 

Каков наилучший способ создания объектов. Когда я создаю свой объект, я не знаю, какой тип клиента есть.

мне нужно что-то вроде:

$user = /* code missing */ 
$user->getName(); // this will trigger the appropiate method.` 
+1

Как компания может продлить пользователя ?? – PeeHaa

+0

Проблема в том, что я могу решить, какой тип пользователя после загрузки данных из MySQL. Также я хочу, чтобы эти данные были личными данными объектов. Объектов User() не будет. Только компания или люди. Пользователь является родовым именем для родителя People, а также компании. Вы можете сказать Client(). – catalinux

ответ

1

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

+0

Я бы сказал, что информация о типе объекта хранится в БД каким-то образом, поэтому 2 заданных поля, скорее всего, не единственные поля таблицы, а заводские методы могут это прочитать. – Stan

+0

Проблема в том, что я могу решить, какой тип пользователя после загрузки данных из MySQL. Также я хочу, чтобы эти данные были личными данными объектов. Объектов User() не будет. Только компания или люди – catalinux

0

Как насчет того, чтобы вы использовали ORM, как Doctrine для такого рода работы. Он поддерживает наследование, поэтому вы можете сопоставить это с вашей схемой базы данных (это должна быть конкретная стратегия класса наследования в Доктрине).

В противном случае попробуйте уточнить, какова ваша цель и конкретная проблема здесь.

+0

У вас есть пример в Doctrine? Я начал 2 недели назад в других проектах с доктриной, и любые советы хороши – catalinux

+0

Существует много хорошей документации онлайн: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference /inheritance-mapping.html –

1

Abstract Factory картина:

interface AbstractUserFactory{ 
    public function buildUser($type); 
} 

class UserFactory implements AbstractUserFactory { 
    public function buildUser($type='user'){ 
     if($type == 'user'){ 
      return new User(); 
     } else if ($type == 'company') { 
      return new Company(); 
     } else if($type == 'people') { 
      return new People(); 
     } else{ 
      throw new Exception("Unknown User type [$type]"); 
     } 
    } 

} 
Смежные вопросы