Free Radical
Free Radical

Reputation: 2072

PHP - how to call a function that is part of an object where one part is a variable?

I need to call an function that is part of an object. The following call works as one would expect:

$someobject = getobject();
$result = $someobject->somefunction->value();

However, I need the "somefunction" component to be a variable.

I have tried to do it like this:

$var = 'somefunction';
$result = '$someobject->' . $var '->value'();

This does not work, but I hope it conveys what I am looking for. I've also tried a lot of variations based upon call_user_func() – without finding a syntax that works.

I am running: PHP 7.2.24-0ubuntu0.18.04.3. Vanilla version for Ubuntu 18.04 LTS.

Upvotes: 0

Views: 60

Answers (3)

Free Radical
Free Radical

Reputation: 2072

Hooray!

The following (two alternative valid syntaxes are produced for the second line) works as expected without producing any errors:

$foobar = 'somefunction';
$result = $someobject->$foobar->value();
$result = $someobject->{$foobar}->value();

The following:

$foobar = 'somefunction';
$result = $someobject->${foobar}->value();

also works (i.e. it produces the expected result), but it also produces this warning:

Warning: Use of undefined constant foobar - assumed 'foobar' (this will throw an Error in a future version of PHP) …

Many thanks to all that commented. In particular Duc Nguyen and Swetank Poddar. I think it was the comment by Duc Nguyen in combination with the following comment by Swetank Poddar that finally cracked it.

Upvotes: 0

IMSoP
IMSoP

Reputation: 97718

To access a property or method dynamically based on its name, you simply use one more $ sign than you would normally.

For example, if we have this object:

class Foo {
    public $someproperty = 'Hello!';

    public function somefunction() {
        return 'Hello World';
    }
}

$someobject = new Foo;

Then we can access the property normally:

echo $someobject->someproperty;

Or dynamically by name:

$var = 'someproperty';
echo $someobject->$var;

Similarly, we can access the method normally:

echo $someobject->somefunction();

Or dynamically by name:

$var = 'somefunction';
$result = $someobject->$var();

Note that your example is a bit confusing, because you talk about "accessing a function where one part is a variable", but all you're actually trying to do is access a property dynamically, and you then happen to be calling a method on the object stored in that property. So the part you've called somefunction is actually the name of a property.

Here's an example that looks a bit like yours, but with the names changed:

class A {
    public $foo;
}
class B {
    public function value() {
        return 'Hello World';
    }
}

$a = new A;
$a->foo = new B;

$propertyname = 'foo';

echo $a->$propertyname->value();

Upvotes: 1

G.Spirov
G.Spirov

Reputation: 318

class Blueprint 
{
    public function method() 
    {
        return 'placeholder';   
    }
}

$object = new Blueprint;
$method = 'method';

// this will output `placeholder`
echo $object->{$method}();

Upvotes: 0

Related Questions