PHP - как вызвать функцию, которая является частью объекта, где одна часть является переменной? - PullRequest
0 голосов
/ 19 апреля 2020

Мне нужно вызвать функцию, которая является частью объекта. Следующий вызов работает, как и следовало ожидать:

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

Однако мне нужно, чтобы компонент somefunction был переменной.

Я попытался сделать это следующим образом:

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

Это не работает, но я надеюсь, что оно передает то, что я ищу. Я также попробовал много вариантов, основанных на call_user_func() - без нахождения синтаксиса, который работает.

Я работаю: PHP 7.2.24-0ubuntu0.18.04.3. Ванильная версия для Ubuntu 18.04 LTS.

Ответы [ 3 ]

1 голос
/ 19 апреля 2020

Для динамического доступа к свойству или методу на основе его имени вы просто используете на один знак $ больше, чем обычно.

Например, если у нас есть этот объект:

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

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

$someobject = new Foo;

Тогда мы можем получить доступ к свойству обычно:

echo $someobject->someproperty;

Или динамически по имени:

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

Аналогично, мы можем получить доступ к методу обычно:

echo $someobject->somefunction();

Или динамически по имени:

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

Обратите внимание, что ваш пример немного сбивает с толку, потому что вы говорите о «доступе к функции, где одна часть является переменной», но все, что вы на самом деле пытаетесь сделать это динамический доступ к свойству , и вы случайно вызываете метод для объекта, хранящегося в этом свойстве. Поэтому часть, которую вы назвали somefunction, на самом деле является именем свойства.

Вот пример, который немного похож на ваш, но с измененными именами:

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();
0 голосов
/ 19 апреля 2020

Ура!

Следующее (два альтернативных допустимых синтаксиса созданы для второй строки) работает, как и ожидалось, без каких-либо ошибок:

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

Следующее:

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

также работает (т. Е. Производит ожидаемый результат), но также выдает следующее предупреждение:

Предупреждение: использование неопределенной константы foobar - предполагается, что foobar (это приведет к ошибке в будущая версия PHP)…

Большое спасибо всем, что прокомментировали. В частности Ду c Нгуен и Свитанк Поддар . Я думаю, что это был комментарий Du c Нгуен в сочетании со следующим комментарием Swetank Poddar , который окончательно взломал его.

0 голосов
/ 19 апреля 2020
class Blueprint 
{
    public function method() 
    {
        return 'placeholder';   
    }
}

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

// this will output `placeholder`
echo $object->{$method}();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...