PHP5 - Ошибка при вызове свойства класса как функции

$f = function($v) {
    return $v + 1;
}

echo $f(4);
// output -> 5

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

class MyClass {
    public $f;

    public function __construct($f) {
        $this->f = $f;
    }

    public function methodA($a) {
        echo $this->f($a);
    }
}

// When I try to call the property `f`, PHP gets confused
// and thinks I am trying to call a method of the class ...
$myObject = new myClass($f);
$myObject->methodA(4);

Вышеуказанное приведет к ошибке:

Call to undefined method MyClass::f()

на что равняется первый $f?

treyBake 01.05.2018 15:13
myClass($f); -> где определяется $f?
WM-SH-PD-TV-FC 01.05.2018 15:13

@AlivetoDie f - это не метод, это функция, хранящаяся в переменной, переданной конструктору как свойство класса.

ma77c 01.05.2018 15:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, проблема в том, что он пытается понять

echo $this->f($a);

И, как вы обнаружили, он хочет вызвать функцию-член f в классе. Если вы измените его на

echo ($this->f)($a);

Он интерпретирует это так, как вы хотите.

PHP 5.6 Спасибо ADyson за комментарий, думаю, это работает

$f = $this->f;
echo $f($a);
eval.in/997679
WM-SH-PD-TV-FC 01.05.2018 15:17

возможно, стоит отметить, что это работает только в PHP7

ADyson 01.05.2018 15:17

Я думал, что это сработает, но это приводит к синтаксической ошибке unexpected '('.

ma77c 01.05.2018 15:17

@AlivetoDie предполагается, что ввод - это функция ... например. eval.in/997678

ADyson 01.05.2018 15:18

@ TT4M.C см. Мой комментарий - вы используете PHP 5? eval.in/997680 показывает, что он не работает в PHP 5, но eval.in/997678 показывает, что он работает в PHP 7

ADyson 01.05.2018 15:18

@ADyson Да, я использую PHP 5.6

ma77c 01.05.2018 15:19

@ TT4M.C в этом случае вы, к сожалению, не можете использовать этот синтаксис.

ADyson 01.05.2018 15:19
$f = $this->f; echo $f($a); в PHP5 вы можете сначала назначить свойство переменной ... затем оно работает
nimmneun 01.05.2018 15:21

@NigelRen, извините, только что видел ваше обновление, тем временем я опубликовал ответ в том же духе. Хотя, похоже, номинированный обман уже охватывает оба случая.

ADyson 01.05.2018 15:24

Хотя ответ Найджела Рена (https://stackoverflow.com/a/50117174/5947043) будет работать в PHP 7, этот слегка расширенный синтаксис будет работать и в PHP 5:

class MyClass {
    public $f;

    public function __construct($f) {
        $this->f = $f;
    }

    public function methodA($a) {
      $func = $this->f;
      echo $func($a);
    }
}

$f = function($v) {
    return $v + 1;
};

$myObject = new myClass($f);
$myObject->methodA(4);

См. https://eval.in/997686 для рабочей демонстрации.

Другие вопросы по теме