2012-12-11 16 views
10

dziedziczone Mam cechęPHP Trait wywołanie funkcji

trait Foo{ 

    protected static function foo(){ 
     echo 'Hello'; 
    } 
} 

i klasę

class Bar{ 
    use Foo; 

    private static function foo(){ 
     Foo::foo(); 

     echo ' World!'; 
    } 
} 

Nie mogę korzystać Foo:foo(). Co mogę zrobić, aby osiągnąć pożądany efekt?

EDIT

Korzystanie

use Foo {foo as parentFoo} 

private static function foo(){ 

    self::parentFoo(); 

    echo ' World!'; 

} 

załatwiło sprawę.

+4

widzieć konflikt rozdzielczości http://php.net/manual/en/language.oop5.traits.php – goat

+0

Psst, starasz się wywołać metodę non-statyczne w sposób statyczny. Powinieneś zobaczyć ostrzeżenie o tym. Może powinieneś zmienić swój poziom "error_reporting". – Charles

+0

O, oops, zapomniałem dodać statyczne słowa kluczowe do opisu. Oboje są statyczni w rzeczywistości. - @rambocoder: Dzięki, zobacz edytuj. Zrobiło to. – arik

Odpowiedz

11

można zrobić coś takiego:

class Bar{ 

    use Foo { 
     Foo::foo as foofoo; 
    } 

    private static function foo(){ 

     self::foofoo(); 

     echo ' World!'; 

    } 

} 
+0

Tak, dokładnie, z wyjątkiem średnika pozycji i słowa kluczowego static;) Dzięki. – arik

+0

Tak, nie widziałem zmiany w pytaniu na "static". –

0

Czy możesz zmienić nazwę swojej metody foo na fooo?

Jeśli tak, proszę wymienić i Foo :: foo() z Foo: fooo() w organizmie metoda klasy statycznej składni przed wykonaniem połączenia (poprzez dodanie słowa kluczowego static do definicji funkcji cecha)

<?php 

trait Foo 
{ 
    protected static function Fooo() 
    { 
     echo 'Hello'; 
    } 
} 

class Bar 
{ 
    use Foo; 

    private static function foo() 
    { 
     self::fooo(); 

     echo ' World!'; 
    } 

    public static function expose() 
    { 
     echo self::foo(); 
    } 
} 

echo Bar::expose(); 

EDYTOWANIE:

Oczywiście na moje pytanie brzmiała: "Nie, nie możesz zmienić nazwy metody cechy", w tym przypadku wskazałeś rozwiązanie związane z rodzimym rozwiązaniem konfliktu osadzonym w PHP: http://php.net/manual/en/language.oop5.traits.php#language.oop5.traits.conflict

Powiązane problemy