rfc:closure_apply
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
rfc:closure_apply [2014/08/06 13:34] – "improvement" not impact ajf | rfc:closure_apply [2014/08/27 01:08] – Ended vote ajf | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== PHP RFC: Closure:: | ====== PHP RFC: Closure:: | ||
- | * Version: 0.2.1 | + | * Version: 0.3 |
- | * Date: 2014-07-29, put to internals 2014-08-03, latest 2014-08-06 | + | * Date: 2014-07-29, put to internals 2014-08-03, latest 2014-08-19 |
* Author: Andrea Faulds, ajf@ajf.me | * Author: Andrea Faulds, ajf@ajf.me | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
Line 18: | Line 18: | ||
</ | </ | ||
- | It calls the closure with the given parameters and returns the result, with '' | + | It calls the closure with the given parameters and returns the result, with '' |
It can be used like so: | It can be used like so: | ||
Line 29: | Line 29: | ||
</ | </ | ||
- | Because the '' | + | The '' |
<code php> | <code php> | ||
class Foo { private $x = 3; } | class Foo { private $x = 3; } | ||
$foo = new Foo; | $foo = new Foo; | ||
- | $foobar = function () { var_dump($this-> | + | $foobar = function () { var_dump($this-> |
- | // without the last parameter (optional, defaults to false), we'd get a static, not unbound closure | + | |
- | $foobar = $foobar-> | + | |
$foobar-> | $foobar-> | ||
</ | </ | ||
- | My [[rfc:function_referencing|Function Referencing as Closures]] proposal similarly relaxes the requirement for a scoped closure to be bound or static out of necessity, | + | '' |
===== Performance ===== | ===== Performance ===== | ||
Line 56: | Line 54: | ||
} | } | ||
$foobar = new FooBar; | $foobar = new FooBar; | ||
- | for ($i = 0; $i < 100000; $i++) { | + | for ($i = 0; $i < 1000000; $i++) { |
$x = $a-> | $x = $a-> | ||
$x(); | $x(); | ||
Line 66: | Line 64: | ||
return $this-> | return $this-> | ||
}; | }; | ||
- | $a = $a-> | ||
class FooBar { | class FooBar { | ||
private $x = 3; | private $x = 3; | ||
} | } | ||
$foobar = new FooBar; | $foobar = new FooBar; | ||
- | for ($i = 0; $i < 100000; $i++) { | + | for ($i = 0; $i < 1000000; $i++) { |
$a-> | $a-> | ||
} | } | ||
</ | </ | ||
- | When run for 100000 iterations, | + | '' |
< | < | ||
andreas-air: | andreas-air: | ||
- | |||
- | real 0m0.259s | ||
- | user 0m0.208s | ||
- | sys 0m0.012s | ||
- | |||
- | andreas-air: | ||
- | |||
- | real 0m0.100s | ||
- | user 0m0.094s | ||
- | sys 0m0.005s | ||
- | </ | ||
- | |||
- | If we up the iterations by 10x, the result is the same: | ||
- | < | + | real 0m1.877s |
- | andreas-air: | + | user 0m1.835s |
- | + | sys 0m0.025s | |
- | real 0m1.966s | + | |
- | user 0m1.959s | + | |
- | sys 0m0.005s | + | |
- | + | ||
andreas-air: | andreas-air: | ||
- | + | ||
- | real 0m0.962s | + | real 0m0.859s |
- | user 0m0.897s | + | user 0m0.826s |
- | sys 0m0.015s | + | sys 0m0.018s |
</ | </ | ||
Line 114: | Line 95: | ||
===== Proposed PHP Version(s) ===== | ===== Proposed PHP Version(s) ===== | ||
- | This is proposed for the next version of PHP, either the next 5.x or PHP NEXT, whichever comes sooner. The patch is based on master, intended for the next 5.x. | + | This is proposed for the next version of PHP, either the next 5.x or PHP NEXT, whichever comes sooner. The patch is based on master, intended for PHP 7. |
===== Future Scope ===== | ===== Future Scope ===== | ||
Line 120: | Line 101: | ||
Partial application (where a new closure is returned that pre-fills the first X arguments) is a possibly worthwhile (though more difficult to implement) addition. | Partial application (where a new closure is returned that pre-fills the first X arguments) is a possibly worthwhile (though more difficult to implement) addition. | ||
- | ===== Proposed Voting Choices | + | ===== Vote ===== |
This is not a language change, so a straight 50%+1 Yes/No vote can be held. | This is not a language change, so a straight 50%+1 Yes/No vote can be held. | ||
+ | |||
+ | Voting started 2014-08-17 but was cancelled the same day due to the removal of unbound scoped closures. | ||
+ | |||
+ | Voting started again on 2014-08-20 and ended 2014-08-27. | ||
+ | |||
+ | <doodle title=" | ||
+ | * Yes | ||
+ | * No | ||
+ | </ | ||
===== Patches and Tests ===== | ===== Patches and Tests ===== | ||
A branch which implements this (with a test) based on the current master can be found here: https:// | A branch which implements this (with a test) based on the current master can be found here: https:// | ||
+ | |||
+ | There is a pull request for review purposes here: https:// | ||
===== References ===== | ===== References ===== | ||
- | * As previously mentioned, my [[rfc: | + | * My [[rfc: |
===== Changelog ===== | ===== Changelog ===== | ||
+ | * v0.3 - Removed unbound scoped closures, made '' | ||
* v0.2.1 - Added performance section | * v0.2.1 - Added performance section | ||
* v0.2 - '' | * v0.2 - '' | ||
* v0.1 - Initial version | * v0.1 - Initial version |
rfc/closure_apply.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1