有没有办法创建一个“简化”这个
的php类(或函数)ucfirst(str_replace('_',' ',html_entity_decode(trim($variable), ENT_QUOTES))));
$ variable可以从任何地方“来”,例如来自另一个函数的全局或只是“标准”变量
答案 0 :(得分:4)
如果你想在一个类中使用它(如标题所暗示的那样),那么你应该创建Filter类。这是常见的事情。但是,与简单函数嵌套相比,正确执行它将会有更多代码。优点是,您可以轻松地将过滤器扩展和组合到几乎任何过滤需求。
我很快就为你准备了一些东西。
interface IFilter {
/**
* @param Mixed $value The value to be filtered
* @return Mixed The filtered value
*/
public function filter($value);
}
所有过滤器都必须实现IFilter
接口。这是为了确保无论何时使用Filter,它都有一个filter()
方法,它接受一个$value
参数。我们不能强制执行返回值,但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:
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;
}
}
FilterChain
接受任何实现IFilter
的对象,如果您将其称为filter()
方法,它将按照您chain()
编辑的顺序迭代所有已链接的过滤器返回传入的$value
:
$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"'
因为FilterChain
本身也实现了IFilter
,所以您也可以将其添加到其他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
,您只需根据需要将Filters和FilterChains一起添加。由于FilterChain
是一个对象,你可以自由传递它。
幸运的是,像这样的过滤器库已经存在,例如Zend_Filter提供了许多预制过滤器,可以单独使用(例如,无需将应用程序迁移到ZF)。
答案 1 :(得分:3)
如果你不止一次使用它,那么我肯定会把它变成一个函数。这样你就不会重复所有的代码了。
function functionName($input){
return ucfirst(str_replace('_',' ',html_entity_decode(trim($input), ENT_QUOTES)));
}
echo functionName($variable);