In PHP, can you instantiate an object and call a method on the same line?
The feature you have asked for is available from PHP 5.4. Here is the list of new features in PHP 5.4:
https://php-legacy-docs.zend.com/manual/php5/en/migration54.new-features
And the relevant part from the new features list:
Class member access on instantiation has been added, e.g.
(new Foo)->bar().
How about:
$obj = new Obj(); $method_result = $obj->method(); // ?
:P
You cannot do what you are asking ; but you can "cheat", using the fact that, in PHP, you can have a function that has the same name as a class ; those names won't conflict.
So, if you declared a class like this :
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
You can then declare a function that returns an instance of that class -- and has exactly the same name as the class :
function Test($param) {
return new Test($param);
}
And now, it becomes possible to use a one-liner, like you asked -- only thing is you are calling the function, thus not using new :
$a = Test(10)->myMethod();
var_dump($a);
And it works : here, I'm getting :
int 20
as output.
And, better, you can put some phpdoc on your function :
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
This way, you'll even have hints in your IDE -- at least, with Eclipse PDT 2.x ; see the screeshot :
Edit 2010-11-30 : Just for information, a new RFC has been submitted, a few days ago, that proposes to add this feature to one of the future versions of PHP.
See : Request for Comments: Instance and method call/property access
So, maybe doing things like these will be possible in PHP 5.4 or another future version :
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]
You can do it more universally by defining an identity function:
function identity($x) {
return $x;
}
identity(new Obj)->method();
That way you don't need to define a function for each class.