Han*_*etz 6 php arrays lambda callable
在PHP中,某些函数将"可调用"作为参数,这意味着您可以指定要在某一点执行的函数.一个例子是array_map.
PHP允许您以多种方式指定可调用对象,例如:
// as a string:
$lowerCaseStrings = array_map('strtolower', $arrayOfStrings);
// object methods as an array
// (this could be done with DateTime directly, of course):
class DateFactory {
private $format;
public function __construct($format) {
$this->format = $format;
}
public function newDate($dateString) {
return DateTime::createFromFormat($this->format, $dateString);
}
}
$factory = new DateFactory('Y-m-d');
$dates = array_map(array($factory, 'newDate'), $arrayOfDateStrings);
// as a lambda expression / closure:
$dates = array_map(
function ($dateString) {
return DateTime::createFromFormat('Y-m-d', $dateString);
},
$arrayOfDateStrings
);
Run Code Online (Sandbox Code Playgroud)
现在,我认为后一种形式在编译期间由PHP引擎进行一次评估,而另一种形式可能在运行时期间进行评估,可能是针对每次调用,这意味着使用闭包对于大量调用会更有效.这个假设是否正确?
小智 3
我用几种不同的方式执行了一个函数并记录了运行时间。看起来使用对常规函数的字符串引用效率更高。
概括
正常的函数定义和调用
$start_time = microtime(true);
function run_this() {
// Empty function
}
for($i = 0; $i < 5000000; $i++) {
run_this();
}
print "Execution time: " . (microtime(true) - $start_time) . "\n";
Run Code Online (Sandbox Code Playgroud)
平均:3.208938837
Lambda 定义和循环内调用
$start_time = microtime(true);
for($i = 0; $i < 5000000; $i++) {
$run_this = function () {
// Empty function
};
$run_this();
}
print "Execution time: " . (microtime(true) - $start_time) . "\n";
Run Code Online (Sandbox Code Playgroud)
平均值:10.32323852
循环外的 Lambda 定义
$start_time = microtime(true);
$run_this = function () {
// Empty function
};
for($i = 0; $i < 5000000; $i++) {
$run_this();
}
print "Execution time: " . (microtime(true) - $start_time) . "\n";
Run Code Online (Sandbox Code Playgroud)
平均值:9.616424465
普通函数定义和call_user_func()
$start_time = microtime(true);
function run_this () {
// Empty function
};
for($i = 0; $i < 5000000; $i++) {
call_user_func('run_this');
}
print "Execution time: " . (microtime(true) - $start_time) . "\n";
Run Code Online (Sandbox Code Playgroud)
平均:13.72040915
Lambda 定义和外部循环以及 call_user_func()
$start_time = microtime(true);
$run_this = function () {
// Empty function
};
for($i = 0; $i < 5000000; $i++) {
call_user_func($run_this);
}
print "Execution time: " . (microtime(true) - $start_time) . "\n";
Run Code Online (Sandbox Code Playgroud)
平均:19.98814855
使用 array_map() 的普通函数定义
$arr = array_pad([], 5000, 0);
$start_time = microtime(true);
function run_this () {
// Empty function
};
for($i = 0; $i < 1000; $i++) {
array_map('run_this', $arr);
}
print "Execution time: " . (microtime(true) - $start_time) . "\n";
Run Code Online (Sandbox Code Playgroud)
平均值:4.001193714
使用 array_map() 在循环外定义 Lambda
$arr = array_pad([], 5000, 0);
$start_time = microtime(true);
$run_this = function () {
// Empty function
};
for($i = 0; $i < 1000; $i++) {
array_map($run_this, $arr);
}
print "Execution time: " . (microtime(true) - $start_time) . "\n";
Run Code Online (Sandbox Code Playgroud)
平均值:10.1116962
| 归档时间: |
|
| 查看次数: |
574 次 |
| 最近记录: |