rfc:instance-method-call
Request for Comments: Instance and method call/property access
- Version: 1.0
- Date: 2010-11-26
- Author: Felipe Pena felipe@php.net
- Status: Implemented (Syntax 2)
Introduction
The purpose of RFC is to presents the support for instantiating a class and calling its methods and accessing its properties on same command. We could use one of two syntaxes below:
Syntax 1 (without brackets)
- new foo->bar() should be read as (new foo)->bar()
- new $foo()->bar should be read as (new $foo())->bar
- new $bar->y()->x should be read as (new ($bar->y)())->x
Syntax 2 (with brackets)
- (new foo())->bar()
- (new $foo())->bar
- (new $bar->y)->x
- (new foo)[0]
Examples
Using brackets
<?php class foo extends ArrayObject { public function __construct($arr) { parent::__construct($arr); } } var_dump( (new foo( array(1, array(4, 5), 3) ))[1][0] ); // int(4) ?>
<?php class foo { public $x = 1; } class bar { public $y = 'foo'; } $x = 'bar'; $bar = new bar; var_dump((new bar)->y); // foo var_dump((new $x)->y); // foo var_dump((new $bar->y)->x); // 1 ?>
<?php class bar { public $z; public function __construct() { $this->z = new stdclass; } public function getZ() { return $this->z; } } var_dump(clone (new bar)->z); var_dump(clone (new bar)->getZ()); ?>
Without brackets
<?php class foo { public $x = 1; public function getX() { return $this->x; } public function setX($val) { $this->x = $val; return $this; } } $X = new foo->setX(10)->getX(); var_dump($X); // int(10) ?>
<?php class foo { public $x = 'testing'; public function bar() { return "foo"; } public function baz() { return new self; } static function xyz() { } } var_dump(new foo()->bar()); // string(3) "foo" var_dump(new foo()->baz()->x); // string(7) "testing" var_dump(new foo()->baz()->baz()->bar()); // string(3) "foo" var_dump(new foo()->xyz()); // NULL new foo()->www(); // Fatal error: Call to undefined method foo::www() ?>
<?php class foo { public function __construct() { throw new Exception('foobar'); } } try { $X = new foo->Inexistent(3); } catch (Exception $e) { var_dump($e->getMessage()); // foobar } ?>
Patch
- http://felipe.ath.cx/diff/instance-method-call.patch (without brackets)
- http://felipe.ath.cx/diff/instance-method-call-2.patch (with brackets)
- http://felipe.ath.cx/diff/instance-method-call-3.patch (with brackets + array dereferencing)
Changelog
- 08/04/2014 - Closed as “implemented”
- 06/11/2011 - Implemented (Syntax 2) in ff48763f4b (PHP 5.4.0)
- 26/11/2010 - Posted RFC on internals
- 27/11/2010 - New syntax proposed
- 29/11/2010 - Added array dereferencing support (e.g. (new foo)[0])
rfc/instance-method-call.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1