2012-12-11 16 views
10

ereditato Ho un trattoPHP Trait chiamata di funzione

trait Foo{ 

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

e una classe

class Bar{ 
    use Foo; 

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

     echo ' World!'; 
    } 
} 

non posso usare Foo:foo(). Cosa posso fare per ottenere l'effetto desiderato?

EDIT

Utilizzando

use Foo {foo as parentFoo} 

private static function foo(){ 

    self::parentFoo(); 

    echo ' World!'; 

} 

ha fatto il trucco.

+4

vedere la risoluzione dei conflitti http://php.net/manual/en/language.oop5.traits.php – goat

+0

Psst, si sta cercando di chiamare un metodo non statico in modo statico. Dovresti vedere un avvertimento a riguardo. Forse dovresti alzare il livello 'error_reporting'. – Charles

+0

Oh, oops, ho dimenticato di aggiungere le parole chiave statiche nella descrizione. Sono entrambi statici nella realtà. - @rambocoder: Grazie, vedi modifica. Ha fatto il trucco. – arik

risposta

11

Si può fare qualcosa di simile:

class Bar{ 

    use Foo { 
     Foo::foo as foofoo; 
    } 

    private static function foo(){ 

     self::foofoo(); 

     echo ' World!'; 

    } 

} 
+0

Sì, esattamente, tranne la posizione del punto e virgola e la parola chiave statica;) Grazie. – arik

+0

Sì, non ho visto la modifica nella domanda a 'statico'. –

0

Sei autorizzato a rinominare il tuo metodo di tratto foo?

Se sì, si prega di fare e sostituire Foo :: foo() con Foo: fooo() nel metodo corpo della classe prima della seguente sintassi chiamata statica (con l'aggiunta di parole chiave statico al definizione di funzione caratteristica)

<?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(); 

EDIT:

Ovviamente, la risposta alla mia domanda era "No, non è consentito rinominare il metodo del tratto", nel qual caso hai indicato una soluzione correlata alla risoluzione nativa dei conflitti incorporata in PHP: http://php.net/manual/en/language.oop5.traits.php#language.oop5.traits.conflict

Problemi correlati