- Output for git.master, git.master_jit, rfc.property-hooks
- <?hh class Guard { private static bool $guarded = false; public static function acquire(): void { self::$guarded = true; } public static function release(): void { self::$guarded = false; } public static function isGuarded(): bool { return self::$guarded; } } class BatchedWriter { const int BATCH_SIZE = 2; private Set<string> $queue = Set { }; private ?Awaitable<ImmMap<string, string>> $waitHandle = null; public async function write(string $id): Awaitable<string> { $this->queue[] = $id; $all_results = await $this->writeAll(); return $all_results->at($id); } private function writeAll(): Awaitable<ImmMap<string, string>> { $wh = $this->waitHandle; if ($wh === null || HH\Asio\has_finished($wh)) { $wh = $this->writeAllImpl(); $this->waitHandle = $wh; } return $wh; } private async function writeAllImpl(): Awaitable<ImmMap<string, string>> { while (count($this->queue) < self::BATCH_SIZE) { await HH\Asio\later(); } $results = Map { }; foreach ($this->queue as $id) { $results[$id] = $id.' is '.(Guard::isGuarded() ? 'guarded' : 'unguarded'); } $this->queue = Set { }; return $results->immutable(); } <<__Memoize>> public static function get(): BatchedWriter { return new BatchedWriter(); } } function stop_eager_execution(): Awaitable<void> { return RescheduleWaitHandle::create(RescheduleWaitHandle::QUEUE_DEFAULT, 0); } function join_for_guard<T>( (function(): Awaitable<T>) $callback, ): T { $awaitable = async { await stop_eager_execution(); return await $callback(); }; return HH\Asio\join($awaitable); } async function do_unguarded_write(): Awaitable<void> { $result = await BatchedWriter::get()->write(__FUNCTION__); var_dump(__FUNCTION__.': '.$result); } async function do_guarded_write(): Awaitable<void> { await HH\Asio\later(); Guard::acquire(); $result = join_for_guard(async () ==> await BatchedWriter::get()->write(__FUNCTION__)); var_dump(__FUNCTION__.': '.$result); Guard::release(); } HH\Asio\join(HH\Asio\va( do_unguarded_write(), do_guarded_write(), ));
This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.
Active branches
Archived branches
Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page
- 2020-03-21 RFC: Is_Literal - declined
- 2020-12-04 Enumerations - included in PHP 8.1
- 2018-06-15 Typed Properties v2 - implemented in PHP 7.4
- 2016-08-12 Object typehint - included in PHP 7.2
- 2016-08-14 Arrow functions - withdrawn
- 2016-05-29 array_change_keys() - withdrawn
- 2016-04-19 Lexical scope support for anonymous classes - suspended
- 2016-04-17 Functional Interfaces - declined
- 2016-03-16 Typed Properties - superseded in favor of Typed Properties 2.0
- 2015-08-27 Callable Prototypes - declined
- 2015-05-01 Short Closures - declined / withdrawn in favor of Arrow Functions
- 2015-02-18 Scalar type hints v5 - included in PHP 7
- 2015-02-14 Union Types - declined
- 2013-09-22 Anonymous classes - included in PHP 7