Это вызвано неоднозначностью вызова, который вы пытаетесь сделать:
$company->myBar('john')->makeDrink();
Поскольку myBar
- это свойство, интерпретатор PHP не ожидает его вызова.Он анализирует его как попытку вызвать метод с именем myBar()
, который не существует и, таким образом, выдает ошибку.
Прямой способ решить эту проблему - прояснить неоднозначность для интерпретатора.Это можно сделать, добавив фигурные скобки вокруг свойства следующим образом:
$company->{myBar}('john')->makeDrink();
Код теперь явно указывает, что myBar
является свойством и должно быть доступно как таковое, но оно содержит значение, котороевызываемый и что вы хотите сделать этот вызов.
Вся эта тема усложняется (слегка) из-за того, что PHP 5.x и PHP 7.x ведут себя по-разному в отношении того, как они по умолчанию обрабатывают эти видынеоднозначность.PHP 7 изменил настройки по умолчанию, чтобы исправить некоторые внутренние несоответствия в языке.В результате в таких ситуациях, когда возникает неоднозначность, если вы хотите, чтобы ваш код работал как на PHP 5.x, так и на 7.x, вы всегда должны использовать фигурные скобки, чтобы явно определить, как вы хотите, чтобы он работал, независимо отработает ли ваш код для вас без них.
В документации об обновлении PHP 7.0 имеется некоторая документация об этом изменении, хотя приведенные примеры не охватывают вашу конкретную ситуацию.