2015-04-18 4 views
1

У меня есть класс, где у меня есть аналогичные функции, которые связаны с различными конечногофункция группы внутри класса

class MyClass { 

    public function case1_changeOrder() { 

    } 

    public function case1_changeLimit() { 

    } 

    public function case2_changeOrder() { 

    } 

    public function case2_changeLimit() { 

    } 


} 

Можно сгруппировать эти функции как-то так я могу избавиться от приставки и сделать что-то вроде

$mc = new MyClass(); 
$mc->case1->changeOrder(); 
$mc->case2->changeOrder(); 

вместо

$mc = new MyClass(); 
$mc->case1_changeOrder(); 
$mc->case2_changeOrder(); 
+2

Можете ли вы объяснить фактическую цель этого класса? Существует много решений (некоторые из них приведены ниже), но невозможно сказать, что лучше, если мы не знаем, чего вы пытаетесь достичь. – Erik

+0

Вместо того, чтобы думать, «как мне группировать функции в этом классе», вам нужно более подробно подумать о том, какие функции и классы вам нужны. Вы упоминаете «разные конечные точки», поэтому подумайте о том, как эти конечные точки представлены в вашем приложении. И спросите себя, что представляет собой класс, который вы сейчас представляете, - просто ли он стал местом хранения некоторых методов, потому что вы не были уверены, где они были? – IMSoP

ответ

1

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

Если операции подобны сделать это с абстрактным базовым классом и наследования, как это (вы будете иметь дополнительное преимущество использования полиморфизма позже, если вам нужно):

abstract class GenericCase 
{ 
    abstract public function changeLimit(); 
    abstract public function changeOrder(); 
} 

Затем два класса, которые наследуют от базовый класс:

class Case1 extends GenericCase 
{ 
    public function changeLimit() 
    { 
     //... case 1 implementation 
    } 

    public function changeOrder() 
    { 
     //... case 2 implementation 
    } 
} 

class Case2 extends GenericCase 
{ 
    public function changeLimit() 
    { 
     //... case 2 implementation 
    } 

    public function changeOrder() 
    { 
     //... case 2 implementation 
    } 
} 

Или вы можете достичь того же, используя общий интерфейс. В этом случае это действительно вопрос предпочтения. См. this tutorial for more details.

Если вы настаиваете делать это с составом, чтобы иметь точную структуру, которую вы просили, смотрите раздел Состав - Ассоциация и агрегацияhere

удачи.

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