2010-08-21 6 views
5

는 PHP 클래스 (또는 함수)를 생성 할 수있는 방법이 있음이PHP는 클래스 (내가 생각하는)

ucfirst(str_replace('_',' ',html_entity_decode(trim($variable), ENT_QUOTES)))); 

은 $ 변수는 어디서든 예를 들어 세계 다른 함수에서에서 "온"또는 수있다 "단순화" 그냥 "표준"변수

답변

3

두 번 이상 사용한다면 분명히 함수에 넣을 것입니다. 그렇게하면 모든 코드를 반복하지 않게됩니다.

function functionName($input){ 
    return ucfirst(str_replace('_',' ',html_entity_decode(trim($input), ENT_QUOTES))); 
} 

echo functionName($variable); 
+0

반환 라인에 5 개의 닫는 괄호와 4 개의 여는 괄호가 있습니다. –

+0

@Peter Ajtai & @ Sam152 두 분 모두에게 감사드립니다. 페이지를 "훨씬"더 편하게 "읽기 쉽도록"/ 유감스럽게 생각합니다. 죄송 합니다만 PA를 받아 들일 수는 없지만 샘은 처음입니다. – user351657

+0

코드를 수정했습니다. 이 함수는 실제로 수행되는 작업을 설명하는 이름이며 코드는 잘 읽힐 것입니다. – Sam152

4

클래스에이 질문 제목이 의미하는 것처럼 이것을 갖고 싶다면 필터 클래스를 만들어야합니다. 이것은해야 할 공통적 인 일입니다. 그러나 간단하게 기능 중첩과 비교할 때, 올바르게 기능하는 데 더 많은 코드가 필요합니다. 장점은 필터를 쉽게 확장하고 결합하여 거의 모든 필터링 요구에 맞출 수 있다는 것입니다.

나는 당신을 위해 뭔가를 빨리 채웠습니다.

interface IFilter { 
    /** 
    * @param Mixed $value The value to be filtered 
    * @return Mixed The filtered value 
    */ 
    public function filter($value); 
} 

모든 필터는 IFilter 인터페이스를 구현해야합니다. 필터를 사용할 때마다 $value 인수를 허용하는 filter() 메서드가 있는지 확인해야합니다. 반환 값을 적용 할 수는 없지만 doc 블록은 필터링 된 값을 반환 할 것으로 예상했습니다. 두 개의 매우 간단한 필터는 다음과 같이 보일 것이다 :

class ucFirstFilter implements IFilter 
{ 
    public function filter($value) { 
     return ucfirst($value); 
    } 
} 

class TrimFilter implements IFilter 
{ 
    public function filter($value) { 
     return trim($value); 
    } 
} 

이것은 PHP의 기본 기능이 주변의 객체 래퍼에 불과하다. 이처럼 사용

$trimFilter = new TrimFilter; 
echo trimFilter->filter(' trim me '); 
// returns 'trim me' 

가 전달 될 수 있기 때문에 다른 두 필터는, 어느 정도 이상의 인수가 더 복잡 :

class SeparatorToSeparatorFilter implements IFilter 
{ 
    protected $_separator; 
    protected $_replacement; 
    public function __construct($separator = '_', $replacement = ' ') 
    { 
     $this->_separator = $separator; 
     $this->_replacement = $replacement; 
    } 
    public function filter($value) { 
     return str_replace($this->_separator, $this->_replacement, $value); 
    } 
} 

class HtmlEntityDecodeFilter implements IFilter 
{ 
    protected $_quoteStyle; 
    protected $_charset; 
    public function __construct($quoteStyle=ENT_COMPAT, $charset='ISO-8859-1') 
    { 
     $this->_quoteStyle = $quoteStyle; 
     $this->_charset = $charset; 
    } 
    public function filter($value) { 
     return html_entity_decode($value, $this->_quoteStyle, $this->_charset); 
    } 
} 

당신이 볼 수 있듯이, 추가 인수의 구성 생성자를 통해 수행됩니다. 몇 가지 기본값을 사용 했으므로 기본값을 벗어날 필요가있을 때만 값을 제공하면됩니다. 두 번째 필터의 경우 기본 함수의 기본 설정을 사용했습니다. 사용 방법은 다음과 같습니다.

$trimFilter = new TrimFilter; 
$separatorFilter = new SeparatorToSeparatorFilter('-'); 
echo $separatorFilter->filter($trimFilter->filter(' trim-me ')); 
// returns 'trim me'; 

이제 단일 Filter 클래스에 여러 개의 필터링을 추가 할 수 있습니다. 몰라. 각 필터는 정확히 한 가지만 수행해야합니다. 필터를 결합하는 더 좋은 방법이 있습니다. 당신이 필요가 FilterChain 일명 여러 다른 필터를 집계 필터 경우 : FilterChainIFilter를 구현하고 호출하는 경우가 filter() 방법의 물건을 받아

class FilterChain implements IFilter 
{ 
    protected $_filters; 
    public function __construct() 
    { 
     $this->_filters = new SplObjectStorage; 
    } 
    public function chain(IFilter $filter) 
    { 
     $this->_filters->attach($filter); 
     return $this; 
    } 
    public function remove(IFilter $filter) 
    { 
     $this->_filters->detach($filter); 
     return $this; 
    } 
    public function filter($value) { 
     foreach($this->_filters as $filter) { 
      $value = $filter->filter($value); 
     } 
     return $value; 
    } 
} 

, 그것은 당신에게 순서대로 chain() 모든 체인 필터를 반복합니다 그들을 에드와는 $value 전달 복귀 : FilterChainIFilter 자체를 구현

$filterChain = new FilterChain; 
$filterChain->chain(new ucFirstFilter) 
      ->chain(new SeparatorToSeparatorFilter) 
      ->chain(new HtmlEntityDecodeFilter(ENT_QUOTES, 'UTF-8')) 
      ->chain(new TrimFilter); 

echo $filterChain->filter(' i am a "string_to_be_filtered" '); 
// outputs 'i am a "string to be filtered"' 

때문에, 당신은 다른 FilterChains에 추가 할 수 있습니다. 이것은 Composite Pattern입니다. 이 필터는 위의 당신이 훨씬 더 코드, 볼 수 있듯이

$chain1 = new FilterChain; 
$chain1->chain(new ucFirstFilter) 
     ->chain(new SeparatorToSeparatorFilter); 

$chain2 = new FilterChain; 
$chain2->chain($chain1); 
$chain2->chain(new HtmlEntityDecodeFilter(ENT_QUOTES, 'UTF-8')) 
     ->chain(new TrimFilter); 

로 기록 될 수 있지만, 그것은 또한 매우 확장입니다.모든 네이티브 함수를 하나의 함수로 묶는 단일 함수를 갖는 것 이상의 주된 이점은 원하는 방식으로 무엇이든 결합 할 수 있다는 것입니다. trim() 함수를 사용하지 않는 다른 함수가 필요하다고 결정하면 완전히 새로운 함수를 작성해야하며 실수로 많은 함수와 중복 가능한 필터 조합을 만들게됩니다. FilterChain을 사용하면 필요에 따라 필터와 필터 체인을 함께 추가하기 만하면됩니다. FilterChain이 개체이기 때문에 자유롭게 전달할 수 있습니다.

다행히도 이와 같은 필터 라이브러리는 이미 존재합니다. 예를 들어 Zend_Filter은 여러 가지 미리 필터를 제공하며 독립형 (예 : 앱을 ZF로 이전하지 않고도) 할 수 있습니다.

관련 문제