Table of Contents

Request for Comments: Instance and method call/property access

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)

Syntax 2 (with brackets)

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

Changelog