Php课程(我认为)

时间:2010-08-21 10:13:13

标签: php oop class

有没有办法创建一个“简化”这个

的php类(或函数)
ucfirst(str_replace('_',' ',html_entity_decode(trim($variable), ENT_QUOTES))));

$ variable可以从任何地方“来”,例如来自另一个函数的全局或只是“标准”变量

2 个答案:

答案 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);