стан тебе все правильно говорит - ты объявляешь параметр объекта класса A, а обращаешься к атрибутам которых там нет.
если у тебя кейс "а я так не вызываю" - то и пиши правильную сигнатуру метода: public static function price(B $objectB)
потому что если твой говнокод в классе C будет использовать другой разработчик - то он передаст тебе какой-нибудь объект D extends A без опшинов и будет прав, потому что ты сам написал такой контракт
а твой код упадет