Для чего и главное где используются {} в php?
$release->{"country-code"} или $release->{"@country"}country-code и @country - это свойства объекта, но написать $release->country-code или $release->@country нельзя, это не переварится интерпретатором. Поэтому и используется такой способ.
Подробнее можно прочитать, разумеется, в документации.return "{$this->product}"
А вот это - дурацкий хак. Насколько я понимаю, это сделано для того, чтобы возвращать строковое представление объекта product. Но гораздо нагляднее делать $this->product->__toString().
Вот пример такой системы:class Product {
	public function __toString() {
		return 'foo';
	}
}

class Thing {
	private $product;
	
	public function __construct() {
		$this->product = new Product;
	}
	
	public function bar() {
		// Писать меньше и можно гордиться своим крутым маневром
		// Но через месяц надо вспоминать, зачем это кавычки вокруг свойства
		return "$this->product";

		// Наглядно и понятно, никакой магии
		return $this->product->__toString();
	}
}

$thing = new Thing();
var_dump($thing->bar());
Ну смотрите. Есть много вариантов, когда получить доступ к свойству нельзя (это, чаще всего, спецсимволы в названии). Тогда мы используем эту конструкцию. Также, бывает, надо вычислить название метода динамически. Также, бывает, надо вставить свойство инстанса в строке текста.return "{$this->product}"; // $this->product = "\"Hello world\"";

$name = "foo";
$name = "bar";
return $this->{$name}; // $this->bar;