2013-03-15 66 views
10

我想鏈方法調用我的類如下:PHP 5.4 - 性狀和自我/靜態

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

不幸的是,我必須括號內封閉施工:

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

,所以我會喜歡有一個特點,我可以在每個班級重用,我希望能夠做到這樣的事情:

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

我希望它b e特性,所以我的類仍然可以從其他類繼承。 我來這一點:

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

class Obj 
{ 
    use Create; 

    // ... 
} 

但好像性狀不處理自己或者靜態的關鍵詞,我不能這樣做get_class($this),因爲這是靜態的。 有沒有明確的方法可以做我想要的?

感謝您的閱讀。

編輯:對於那些誰不知道,這是爲什麼我想這是一個特點,而不是一個抽象基類:

$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'))); 

少支架深度,少犯錯誤,少的時間來修復這些錯誤需要,還有一個更容易閱讀的代碼,在我看來,代碼更好看。

+2

使用括號的問題究竟是什麼? – Spudley 2013-03-15 23:09:37

+0

減少括號的數量可以通過忘記其中一個問題以及解決問題所需的時間以及使代碼更易於閱讀和理解來減少犯錯誤的可能性。 – Virus721 2013-03-15 23:15:01

+0

嗯,說實話,我會說括號內的代碼是完全可讀的,特別是如果你使用的是體面的IDE。但每一個都是屬於自己的。 :-) – Spudley 2013-03-15 23:17:18

回答

8

是的,有get_called_class(),這正是你想要的。

+1

完美謝謝! :D他們的新功能的工作方式對我來說並不直觀:( – Virus721 2013-03-15 23:10:28

0

我不明白爲什麼你不想使用括號 - 它不完全是世界上最糟糕的語法(事實上,我認爲從視覺角度來看它比雙冒號語法更好想要替換它)

但是,如果你確實想在所有的類上都有這樣的工廠方法,那麼爲什麼不創建一個基類,以便你所有的其他類擴展定義了create方法?我沒有看到你需要一個特質。

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

,然後所有其他類extends BaseClass,在這裏你不必extends了。

+0

感謝您的回答,正如我所解釋的,簡單的繼承是其原因 – Virus721 2013-03-15 23:17:00

+0

如果這是一個基類,並且您的核心類擴展它,那麼類如果它將成爲你所有類的一個特性,那麼這樣的基類是非常有意義的 – Spudley 2013-03-15 23:19:11

+0

是的,但是在這種情況下我不能讓這個類繼承自這個BaseClass,子類也繼承它,特性派上用場。此外,重用一種方法或一套方法是特質的確切目的。 – Virus721 2013-03-15 23:23:11

-3

特性是PHP中的一項新功能。該功能在5.4版中引入。這是PHP的多重繼承的替代

例:

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

輸出爲:NetTutsPlus

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

輸出爲:NetTutsPlus

與對象$ o我們的幫助可以訪問特性函數值..