2011-08-16 3 views
0

Я не могу понять, как работает код? Я не знаю почему? Возможно ли это?Перегрузка метода и наследование класса

Я хочу всегда вызывать класс по умолчанию и там методы. Но на самом деле в зависимости от параметра givven. Я хочу загрузить методы из этого клиента спецификаций?

<?php 
#System Defaults 
namespace DefaultNameSpace; 

class defaultClass{ 

    private $property; 

    public function __construct($cusotmer) 
    { 
     if (isset($cusotmer)){ 
      $namespace = '\Customer' . $cusotmer .'Namespace\defaultClass'; 
      # create new dynamic object 
      return new $namespace(); 
     } else { 
      return $this; 
     } 

    } 
    public function printInvoice(){ 
     echo 'Default Print'; 
    } 
    public function createInvoice($invoice){} 
} 

#Customer One defaults 
namespace CustomerOneNamespace; 

class defaultClass extends \DefaultNameSpace\defaultClass { 

    private $property; 

    public function __construct() 
    { 
     return $this; 
    } 
    public function printInvoice(){ 
     echo 'Customer One'; 
    } 
    public function createInvoice ($invoice){ 
     echo 'Create invoice Customer One '.$invoice; 
    } 
} 
# Customer Two Defaults 
namespace CustomerTwoNamespace; 

class defaultClass extends \DefaultNameSpace\defaultClass { 

    private $property; 

    public function __construct() 
    { 
     return $this; 
    } 
    public function printInvoice(){ 
     echo 'Customer Two'; 
    } 
} 
# Call alsways default Class 
$test = new \DefaultNameSpace\defaultClass('Two'); 
$test->printInvoice(); 
$test->createInvoice('123456'); 

?> 
+1

Конструктор не может ничего вернуть. –

ответ

3

Вы не можете создать объект класса descendatnt при вызове конструктора класса предка, поэтому этот код не будет работать так, как вы хотите.

$test = new \DefaultNameSpace\defaultClass('Two'); 

Чтобы достичь того, чего вы хотите, вы можете использовать Factorypattern. Упрощенный (и очень примитивный) пример:

function factoryMethod($type){ 
    $result = null; 
    switch($type){ 
     case 1: 
      $result = new Class1(); 
      break; 
     case 2: 
      $result = new Class2(); 
      break; 
     default: 
      $result = new ClassDefault(); 
      break; 
    } 
    return $result; 
} 

$obj = factoryMethod(2); 
$obj->printInvoice(); 

Обратите внимание, что вы полностью ответственны за возвращение из factoryMethod объектов, которые реализуют необходимые интерфейс, поскольку PHP не поддерживают возвращение типа намекая (насколько я знаю).

+0

Хммм, я знаю этот вариант. Но это означает, что мне приходится жестко кодировать пространство имен и клиентов в моих классах по умолчанию. если бы мы могли сделать это динамически, это было бы здорово, это означает, что если клиент уйдет, мне не нужно заходить в мой код, чтобы удалить его. Мне нужно только удалить его папку, и я закончен, пространство имен будет представлять структуру папок. –

+0

Я думаю, что у вас странный подход в дизайне ... У вас есть только несколько клиентов с существенными различиями в бизнес-логике для каждого из них? Не считаете ли вы, что лучше иметь один класс «Клиент» и отличать клиентов по их идентификаторам? – J0HN

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