는 PHP 클래스 (또는 함수)를 생성 할 수있는 방법이 있음이PHP는 클래스 (내가 생각하는)
ucfirst(str_replace('_',' ',html_entity_decode(trim($variable), ENT_QUOTES))));
은 $ 변수는 어디서든 예를 들어 세계 다른 함수에서에서 "온"또는 수있다 "단순화" 그냥 "표준"변수
는 PHP 클래스 (또는 함수)를 생성 할 수있는 방법이 있음이PHP는 클래스 (내가 생각하는)
ucfirst(str_replace('_',' ',html_entity_decode(trim($variable), ENT_QUOTES))));
은 $ 변수는 어디서든 예를 들어 세계 다른 함수에서에서 "온"또는 수있다 "단순화" 그냥 "표준"변수
두 번 이상 사용한다면 분명히 함수에 넣을 것입니다. 그렇게하면 모든 코드를 반복하지 않게됩니다.
function functionName($input){
return ucfirst(str_replace('_',' ',html_entity_decode(trim($input), ENT_QUOTES)));
}
echo functionName($variable);
클래스에이 질문 제목이 의미하는 것처럼 이것을 갖고 싶다면 필터 클래스를 만들어야합니다. 이것은해야 할 공통적 인 일입니다. 그러나 간단하게 기능 중첩과 비교할 때, 올바르게 기능하는 데 더 많은 코드가 필요합니다. 장점은 필터를 쉽게 확장하고 결합하여 거의 모든 필터링 요구에 맞출 수 있다는 것입니다.
나는 당신을 위해 뭔가를 빨리 채웠습니다.
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 일명 여러 다른 필터를 집계 필터 경우 : FilterChain
는 IFilter
를 구현하고 호출하는 경우가 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
전달 복귀 : FilterChain
도 IFilter
자체를 구현
$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로 이전하지 않고도) 할 수 있습니다.
반환 라인에 5 개의 닫는 괄호와 4 개의 여는 괄호가 있습니다. –
@Peter Ajtai & @ Sam152 두 분 모두에게 감사드립니다. 페이지를 "훨씬"더 편하게 "읽기 쉽도록"/ 유감스럽게 생각합니다. 죄송 합니다만 PA를 받아 들일 수는 없지만 샘은 처음입니다. – user351657
코드를 수정했습니다. 이 함수는 실제로 수행되는 작업을 설명하는 이름이며 코드는 잘 읽힐 것입니다. – Sam152