关于php快速应用多个函数

前几天偶然看到好象是@yegle发的一个关于PHP应用多个函数的文章:由Karthik Viswanathan的How to Quickly Apply Many PHP Functions。其中提到了一个采用字符串分隔执行多个函数的方法,最后简化成的精华如下:

function apply( &$var, $list ) {
	$functions = split( '\|', $list );

	foreach( $functions as $change ) {
		$var = $change( $var );
	}
}

这样调用就可以写成:

$str = "      heLLO HoW ARE you?        ";
apply( $str, 'trim|strtolower|ucwords|strip_tags' );

echo "'" . $str . "'";

执行结果:

'Hello How Are You?'
Function 'apply' costs 0.071048736572266ms

个人非常不习惯这种方式。
更习惯采用类似于jQuery的方式,就是类似于$strObj->trim()->strtolower()->ucwords()->strip_tags()。

版本一:

class StrApply0 {
	var $str = '';

	function __construct($s) {
		$this->str = $s;
	}

	function trim() {
		$this->str = trim($this->str);
		return $this;
	}

	function strtolower() {
		$this->str = strtolower($this->str);
		return $this;
	}

	function ucwords() {
		$this->str = ucwords($this->str);
		return $this;
	}

	function strip_tags() {
		$this->str = strip_tags($this->str);
		return $this;
	}

	function toString() {
		return $this->str;
	}
}

与函数方式比较的执行效果:

'Hello How Are You?'
Function 'apply' costs 0.063896179199219ms
'Hello How Are You?'
Class 'apply' costs 0.014066696166992ms

可以看出,性能方面还是具有一定优势的。

借助元编程(meta programming),我们可以更节省代码。如果考虑函数是否存在,还可以使用function_exists函数,进行合法性检测。
版本二:

class StrApply1 {
	var $str = '';

	function __construct($s) {
		$this->str = $s;
	}

	function __call($name, $arguments) {
		if(function_exists($name)) {
			$s = $name($this->str);
			$this->str = $s;
		}
		return $this;
	}

	function toString() {
		return $this->str;
	}
}

版本三:

class StrApply2 {
	var $str = '';

	function __construct($s) {
		$this->str = $s;
	}

	function __call($name, $arguments) {
		try {
			$s = $name($this->str);
			$this->str = $s;
		} catch(Exception $e) {
		}
		return $this;
	}

	function toString() {
		return $this->str;
	}
}

与函数方式执行效果比较:

'Hello How Are You?'
Function 'apply' costs 0.08392333984375ms
'Hello How Are You?'
Class 'apply' costs 0.02598762512207ms
'Hello How Are You?'
Class2 'apply' costs 0.014066696166992ms

版本二具有一定的容错性,你可以任意使用函数的名称,函数名错误也不会受影响。性能方面也不弱。函数方式效率最低。而代码量则差不多。

附上代码,点此下载

参考:

1. How to Quickly Apply Many PHP Functions

2. PHP 计算页面执行时间

3.

打赏

《关于php快速应用多个函数》有1个想法

  1. You may call the classes like:

    $str = "          heLLO HoW ARE you?        ";
    $rte = new runtime();
    $rte->start();
    $sto = new StrApply1($str);
    $str = $sto->trim()->strtolower()->ucwords()->strip_tags()->a()->toString();
    echo "'" . $str . "'";
    $rte->stop();
    echo "\r\nClass 'apply' costs " . $rte->spent() . "ms\r\n";
    
    
    $str = "          heLLO HoW ARE you?        ";
    $rte = new runtime();
    $rte->start();
    $sto = new StrApply2($str);
    $str = $sto->trim()->strtolower()->ucwords()->strip_tags()->toString();
    echo "'" . $str . "'";
    $rte->stop();
    echo "\r\nClass2 'apply' costs " . $rte->spent() . "ms\r\n";
    

发表评论

电子邮件地址不会被公开。 必填项已用*标注