2013-11-25 15 views
0

有我在許多類我的應用程序的使用一些實用功能,有些例子是:共享實用功能的應用範圍

private function _trailingSlashIt($s) { return strlen($s) <= 0 ? '/' : (substr($s, -1) !== '/' ? $s . '/' : $s); } 
private function _endsWith($haystack, $needle) { return $needle === "" || substr($haystack, -strlen($needle)) === $needle; } 
private function _startsWith($haystack, $needle) { return $needle === "" || strpos($haystack, $needle) === 0; } 

就目前而言 - 直到我找到一個更好的解決辦法 - 我複製我需要每個使用它們的類的函數。

在第一次嘗試,以避免重複的代碼,我有一個實用程序(靜態)類,而我會做這樣的事情:

$path = StringUtils::trailingSlashIt($path); 

與解決方案的問題是,它會在硬連線的依賴我的課程。 (我寧願複製每個類中的函數)。

另一個想法是將實用類注入到我的對象中,但不知何故,這只是一些函數,並不適用,我可能必須將它們注入到我的許多對象中。

我想知道別人怎麼處理這個問題。感謝您的任何建議!

回答

1

如果您使用PHP 5.4或更高版本,我會使用traits

有點類似於使用靜態類,但是,你叫$this->theUtility() vs StringUtils::theUtility()

<?php 
trait StringUtilTrait 
{ 
    private function trailingSlashIt($s) 
    { 
     return strlen($s) <= 0 ? '/' : (substr($s, -1) !== '/' ? $s . '/' : $s); 
    } 

    // other stuff 
} 

class SomeClass 
{ 
    use StringUtilTrait; 

    public function someMethod() 
    { 
     // $this->trailingSlashIt(...); 
    } 
} 

或者,你可以使用注射,但提供的默認實例:

<?php 
class StringUtil 
{ 
    // ... 
} 

class SomeClass 
{ 
    private $stringutil = null; 

    public function setStringUtil(StringUtil $util) 
    { 
     $this->stringutil = $util; 
    } 

    public function getStringUtil() 
    { 
     if (null === $this->stringutil) { 
      $this->stringutil = new StringUtil(); 
     } 

     return $this->stringutil; 
    } 
}