Oi Henrique, vou tentar te dar um help.
1 - Você perguntou para que serve a função public function : Acredito que você a sua dúvida seja em referência a palavra chave public, correto? A palavra chave public é um modificador de acesso que permite que a função seja disponível em qualquer parte da aplicação. Ao criar o objeto Calculadora você poderá ter acesso a função calculaMedia graças ao public. Dê uma pesquisada sobre modificadores de acesso em PHP, aqui na Alura tem cursos de orientações a objetos que te dará maiores detalhes.
2 - Sim, poderia ter usado o foreach ao invés do for. Na verdade existe opções até mais elegantes para realizar essa tarefa, mas acredito que o Vinicius fez dessa forma para mostrar "na unha" como se realiza esse cálculo.
foreach($notas as $nota){
$soma += $nota; // é o mesmo que $soma = $soma + $nota
}
$media = $soma/$quantidadeDeNotas;
...restante do código
3- Acho que você quer saber o significado da palavra chave return, correto?
Quando uma função encontra a palavra chave return ela (a função) retorna o valor que está atrelado a esse retorno. No exemplo temos "return $media", isso quer dizer que a função irá retornar o valor que está armazenado na variável $media e após isso encerrar a sua tarefa.
4 - O simbolo de interrogação antes do float "?float" ao final da assinatura da função é um nullable return type hint. Basicamente isso significa que além da minha função poder retornar um valor do tipo de float ela pode retornar um valor nulo também, resumindo, a minha função pode retornar nada ou pode retornar um float. Observe que dentro do else existe um "return null" ou seja, a minha função pode retornar um null, então eu uso o simbolo de interrogação ? para especificar essa situação. Dê uma pesquisada posteriomente sobre type hint no PHP.
5 - A sua função pode sim receber decimais, ela recebe como parâmetro um array e esse array pode conter qualquer tipo de dados. Infelizmente no PHP não conseguimos dizer qual tipo de dados específico o array pode conter, como em outras linguagens ( não irei entrar nessa seara aqui). O ideal seria você fazer uma verificação para saber se os dados recebidos no array são numéricos.