Question

Is there a way to call a method on a temporary declared object without being forced to assign 1st the object to a variable?

See below:

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}   
}

$temp = new Test();
echo $temp->get(); //ok

echo new Test()->get(); //invalid syntax
echo {new Test()}->get(); //invalid syntax
echo ${new Test()}->get(); //invalid syntax
Was it helpful?

Solution

I use the following workaround when I want to have this behaviour.

I declare this function (in the global scope) :

function take($that) { return $that; }

Then I use it this way :

echo take(new Test())->get();

OTHER TIPS

What you can do is

class Test
{
   private $i = 7;      
   public function get() {return $this->i;}

   public static function getNew() { return new self(); }
}

echo Test::getNew()->get();

Why not just do this:

class Test
{
   private static $i = 7;      
   public static function get() {return self::$i;}   
}

$value = Test::get();

Unfortunately, you can't do that. It's just the way PHP is, I'm afraid.

No. This is a limitation in PHP's parser.

i often use this handy little function

 function make($klass) {
    $_ = func_get_args();
    if(count($_) < 2)
        return new $klass;
    $c = new ReflectionClass($klass);
    return $c->newInstanceArgs(array_slice($_, 1));
 }

usage

make('SomeCLass')->method();

or

make('SomeClass', arg1, arg2)->foobar();

Impossible and why would you create an object this way at all?

The point of an object is to encapsulate unique state. In the example you gave, $i will always be 7, so there is no point in creating the object, then getting $i from it and then losing the object to the Garbage collector because there is no reference to the object after $i was returned. A static class, like shown elsewhere, makes much more sense for this purpose. Or a closure.

Related topic:

This is an old question: I'm just providing an updated answer.

In all supported versions of PHP (since 5.4.0, in 2012) you can do this:

(new Test())->get();

See https://secure.php.net/manual/en/migration54.new-features.php ("Class member access on instantiation").

This has come up very recently on php-internals, and unfortunately some influential people (e. g. sniper) active in development of PHP oppose the feature. Drop an email to php-internals@lists.php.net, let them know you're a grownup programmer.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top