2012-12-11 45 views
10

我有一個特點PHP特質調用繼承功能

trait Foo{ 

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

和一類

class Bar{ 
    use Foo; 

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

     echo ' World!'; 
    } 
} 

我不能使用Foo:foo()。我能做些什麼來達到預期的效果?

編輯

使用

use Foo {foo as parentFoo} 

private static function foo(){ 

    self::parentFoo(); 

    echo ' World!'; 

} 

的伎倆。

+4

看到衝突解決http://php.net/manual/en/language.oop5.traits.php – goat

+0

噓,你要調用非靜態方法以靜態的方式。你應該看到一個警告。也許你應該把你的'error_reporting'級別升高。 – Charles

+0

哦,哎呀,我忘了在描述中添加靜態關鍵字。它們在現實中都是靜態的。 - @rambocoder:謝謝,請參閱編輯。它做了詭計。 – arik

回答

11

你可以做這樣的事情:

class Bar{ 

    use Foo { 
     Foo::foo as foofoo; 
    } 

    private static function foo(){ 

     self::foofoo(); 

     echo ' World!'; 

    } 

} 
+0

是的,除了分號位置和靜態關鍵字外;)謝謝。 – arik

+0

是的,沒有看到「靜態」問題的變化。 –

0

是否允許將特徵方法foo重命名爲fooo?

如果是,請不要和更換美孚:: foo的()與富貴:fooo()在你的類方法體(加入static關鍵字你的特質函數定義)

<?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(); 
下面的靜態調用語法之前

編輯:

很明顯,我的問題的答案是「不,你不能重命名特徵方法」,在這種情況下,你已經指出了一個解決方案與嵌入在PHP中的原生衝突解決方案有關: http://php.net/manual/en/language.oop5.traits.php#language.oop5.traits.conflict