Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

calling a method of an object at instance creation

Tags:

object

php

In PHP why can't I do:

class C
{
   function foo() {}
}

new C()->foo();

but I must do:

$v = new C();
$v->foo();

In all languages I can do that...

like image 640
xdevel2000 Avatar asked Nov 27 '22 15:11

xdevel2000


1 Answers

Starting from PHP 5.4 you can do

(new Foo)->bar();

Before that, it's not possible. See

  • One of many question asking the same on SO
  • Discussion on PHP Internals
  • Another Discussion on PHP Internals
  • Relevant Feature Request in BugTracker

But you have some some alternatives

Incredibly ugly solution I cannot explain:

end($_ = array(new C))->foo();

Pointless Serialize/Unserialize just to be able to chain

unserialize(serialize(new C))->foo();

Equally pointless approach using Reflection

call_user_func(array(new ReflectionClass('Utils'), 'C'))->foo();

Somewhat more sane approach using Functions as a Factory:

// global function
function Factory($klass) { return new $klass; }
Factory('C')->foo()

// Lambda PHP < 5.3
$Factory = create_function('$klass', 'return new $klass;');
$Factory('C')->foo();

// Lambda PHP > 5.3
$Factory = function($klass) { return new $klass };
$Factory('C')->foo();

Most sane approach using Factory Method Pattern Solution:

class C { public static function create() { return new C; } }
C::create()->foo();
like image 81
Gordon Avatar answered Dec 10 '22 02:12

Gordon