2013-03-15 11 views
10

Chcę metodą łańcuchowej wzywa moich klas, co następuje:PHP 5.4 - Cechy i self/static

new Obj($args, $if, $any)->foo()->bar(); 

Niestety muszę ująć budowę wewnątrz nawiasu:

(new Obj($args, $if, $any))->foo()->bar(); 

Więc chciałbym lubią mieć cechę, że mogę ponownie wykorzystać w każdej klasie i chcą być w stanie zrobić coś takiego:

Obj::create($args, $if, $any)->foo()->bar(); 

chcę go do b Cecha więc moje klasy mogą nadal dziedziczyć z innych klas. Doszedłem do tego punktu:

trait Create 
{ 
    public static final function create() 
    { 
     $reflect = new ReflectionClass(/* self ? static ? Anything else ? */); 
     return $reflect->newInstanceArgs(func_get_args()); 
    } 
} 

class Obj 
{ 
    use Create; 

    // ... 
} 

Ale wydaje się, że cechy nie obsługiwać własny lub statycznych słów kluczowych, a nie mogę zrobić get_class($this) ponieważ jest statyczna. Czy istnieje wyraźny sposób robienia tego, co chcę?

Dzięki za przeczytanie.

EDIT: Dla tych, którzy zastanawiać, oto dlaczego ma to być cecha, a nie abstrakcyjną klasą bazową:

$database = (new Database()) 
    ->addTable((new Table()) 
     ->addColumn((new Column('id', 'int')) 
      ->setAttribute('primary', true) 
      ->setAttribute('unsigned', true) 
      ->setAttribute('auto_increment', true)) 
     ->addColumn(new Column('login', 'varchar')) 
     ->addColumn(new Column('password', 'varchar'))); 

$database = Database::create() 
    ->addTable(Table::create() 
     ->addColumn(Column::create('id', 'int') 
      ->setAttribute('primary', true) 
      ->setAttribute('unsigned', true) 
      ->setAttribute('auto_increment', true)) 
     ->addColumn(Column::create('login', 'varchar')) 
     ->addColumn(Column::create('password', 'varchar'))); 

Mniej głębokość wspornik, mniej błędów, a mniej czasu potrzeba, aby naprawić te błędy oraz łatwiejszy do odczytania kod i, moim zdaniem, lepiej wyglądający kod.

+2

jaki jest dokładnie problem z używaniem nawiasów? – Spudley

+0

Zmniejszenie liczby nawiasów zmniejsza prawdopodobieństwo popełnienia błędu, zapominając o jednym z nich i czasie potrzebnym do jego naprawienia, a także ułatwia odczytanie i zrozumienie kodu. – Virus721

+0

hmm, cóż, szczerze mówiąc, powiedziałbym, że kod z nawiasami jest doskonale czytelny, szczególnie jeśli używasz przyzwoitego IDE. Ale każdy do własnego. :-) – Spudley

Odpowiedz

8

Tak, jest get_called_class(), który robi dokładnie to, co chcesz.

+1

Działa doskonale dzięki! : D Sposób, w jaki działają ich nowe funkcje, nie jest dla mnie intuicyjny :( – Virus721

0

Nie rozumiem, dlaczego nie chcesz używać nawiasów klamrowych - to nie jest najgorsza składnia na świecie (w rzeczywistości twierdzę, że z perspektywy wizualnej jest ładniejsza niż podwójna składnia dwukropka chcesz go zastąpić)

Ale jeśli chcesz mieć taką metodę fabryczną jak ta na wszystkich twoich klasach, dlaczego nie po prostu utworzyć klasę bazową, która obejmuje wszystkie inne klasy od tej, która definiuje metodę create? Nie widzę, żebyś potrzebował na to cechy.

class BaseClass { 
    public function create() { 
     ... 
    } 
} 

a następnie wszystkie inne klasy extends BaseClass, gdzie nie masz extends już.

+0

Dziękuję za odpowiedź: jak wyjaśniłem, powodem jest proste dziedziczenie: – Virus721

+0

jeśli jest to klasa podstawowa, a klasy podstawowe ją rozszerzają, to klasy jeśli będzie to cechą wszystkich twoich klas, wtedy taka podstawowa klasa ma sens. – Spudley

+0

Tak, ale w sytuacji, gdy nie mogę sprawić, by klasy dziedziczyły po tej klasie bazowej, więc że klasy podrzędne również go dziedziczą, przydaje się cecha, a ponowne użycie metody lub zestawu metod jest dokładnym celem danej cechy. – Virus721

-3

Cechy to nowa funkcja w PHP. ta funkcja wprowadza się w wersji 5.4. Jest to substytut wielokrotnego dziedziczenia w PHP

PRZYKŁAD:

trait Net 
{ 
    public function net() 
    { 
     return 'Net'; 
    } 
} 

trait Tuts 
{ 
    public function tuts() 
    { 
     return 'Tuts'; 
    } 
} 

class NetTuts 
{ 
    use Net, Tuts; 
    public function plus() 
    { 
     return 'Plus'; 
    } 
} 

$o = new NetTuts; 
echo $o->net(), $o->tuts(), $o->plus(); 

wyjście jest: NetTutsPlus

echo (new NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus(); 

wyjście jest: NetTutsPlus

za pomocą obiektu $ o my może uzyskać dostęp do wartości funkcji cecha ..