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/04 13:54] – Performance 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 | + | * 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:// | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | PHP has had Closures since 5.3, and since 5.4 has had '' | + | PHP has had Closures since 5.3, and since 5.4 has had '' |
===== Proposal ===== | ===== Proposal ===== | ||
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 ===== | ||
- | While not the sole benefit of this RFC, it does have a significant | + | While not the sole benefit of this RFC, it can provide |
- | <code> | + | We use two test scripts, '' |
- | andreas-air: | + | |
- | + | <file php a.php> | |
- | real 0m0.259s | + | $a = function () { |
- | user 0m0.208s | + | |
- | sys 0m0.012s | + | }; |
- | + | class FooBar { | |
- | andreas-air: | + | |
- | + | } | |
- | real 0m0.100s | + | $foobar = new FooBar; |
- | user 0m0.094s | + | for ($i = 0; $i < 1000000; $i++) { |
- | sys 0m0.005s | + | |
- | </code> | + | |
- | + | } | |
- | If we up the iterations by 10x, the result is the same: | + | </ |
+ | |||
+ | <file php b.php> | ||
+ | $a = function () { | ||
+ | | ||
+ | }; | ||
+ | class FooBar { | ||
+ | | ||
+ | } | ||
+ | $foobar = new FooBar; | ||
+ | for ($i = 0; $i < 1000000; $i++) { | ||
+ | | ||
+ | } | ||
+ | </file> | ||
+ | |||
+ | '' | ||
< | < | ||
- | andreas-air: | + | andreas-air: |
- | + | ||
- | real 0m1.966s | + | real 0m1.877s |
- | user 0m1.959s | + | user 0m1.835s |
- | sys 0m0.005s | + | sys 0m0.025s |
- | + | ||
- | andreas-air: | + | andreas-air: |
- | + | ||
- | real 0m0.962s | + | real 0m0.859s |
- | user 0m0.897s | + | user 0m0.826s |
- | sys 0m0.015s | + | sys 0m0.018s |
</ | </ | ||
Line 82: | 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 88: | 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