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

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: 2014/04/09 00:47 by salathe