Acredito que exista um erro nas classes apresentadas no material escrito. Primeiro a existência do termo public na definição da classe e o segundo erro é nas funções avalia. Elas estão utilizando uma variável não definida, sendo que o correto seria o uso do $this->esquerda e $this->direita .
public class Soma implements Expressao {
private $esquerda;
private $direita;
function __construc($esquerda, $direita) {
$this->esquerda = $esquerda;
$this->direita = $direita;
}
public function avalia() {
$resultadoDaEsquerda = $esquerda->avalia();
$resultadoDaDireita = $direita->avalia();
return $resultadoDaEsquerda + $resultadoDaDireita;
}
}
public class Subtracao implements Expressao {
private $esquerda;
private $direita;
function __construct(Expressao $esquerda, Expressao $direita) {
$this->esquerda = $esquerda;
$this->direita = $direita;
}
public function avalia() {
$resultadoDaEsquerda = $esquerda->avalia();
$resultadoDaDireita = $direita->avalia();
return $resultadoDaEsquerda - $resultadoDaDireita;
}
}