Com o lançamento do Scriptcase 9.8 seu projetos podem ser publicados em ambinetes atualizados, com o PHP 8 e 8.1.

Lembrando que ainda é possível realizar a publicação em ambientes com o PHP mais desatualizado, sendo compatível com o PHP 5.6 ou superior.

> Afim de evitar problemas de incompatibilidade em seus códigos em eventos ou bibliotecas, recomedamos que o PHP utilizando em seu ambiente de desenvolvimento seja o mesmo do utilizado na produção.

A atualização do PHP trás diversas melhorias para o Scriptcase, como melhora de performace e segurança tanto no ambiente de desenvolvimento quanto nas aplicações geradas pela ferramenta.\
Junto a atualização do PHP algumas funções são implementadas ou tem seus funcionamentos alterados afim de melhorar a utilização.

Confira abaixo algumas novidades do PHP, para ter acesso a lista completa [clique aqui](https://www.php.net/manual/pt_BR/appendices.php).

## Readonly Properties

Suporte a propriedades somente leitura. Este tipo de propriedade não pode ser modificada ou editada após usa inicialização.

**Como funcionava antes**

 1. Class BlogData

 2. {

 3. private Status $status

 4. public function __construct(Status $status)

 5. {

 6. $this->status = $status;

 7. }

 8. public function getStatus(): Status

 9. {

10. return $this->status;

11. }

12. }

**No PHP 8.1**

1. Class BlogData

2. {

3. public readonly Statys $status

4. public function __construct(Status $status)

5. {

6. $this->status = $status;

7. }

8. }

## Operador "nullsafe" ?->

Implementação do operador nullsafe(**?->**) permite realizar verificações de valores nulo de uma forma bem mais simples.

Abaixo seguem os códigos comparado a utilização do operador no PHP 8 e como o mesmo códido deveria ser feito em versões anteriores.

**A partir do PHP 8, esta linha:**

1. $result = $repository?->getUser(5)?->name;

**É o equivalente ao seguinte código em versões anteriores do PHP:**

 1. if (is_null($repository)) {

 2. $result = null;

 3. } else {

 4. $user = $repository->getUser(5);

 5. if (is_null($user)) {

 6. $result = null;

 7. } else {

 8. $result = $user->name;

 9. }

10. }

## Propriedades tipadas

As propriedades de classe agora suportam declarações de tipo.

1. class User {

2. public int $id;

3. public string $name;

4. }

O exemplo acima reforçará que `$user->id` pode ser atribuído apenas com valores int e `$user->name` somente com valores de string.

## Union Types

Permite que uma mesma variável aceite dois tipos distintos de dados. Para definir os tipos que a variável pode receber basta utilizar o pipe "**|**" entre os tipos.

**Exemplo resumido da utilização em código.**

1. function myFunction(int|float $number): int

2. {

3. return round($number);

4. }

## Função str_contains

Permite realizar uma busca dentro de uma string retornando um booleano.

Para mais informações sobre esta função acesse o <https://www.php.net/manual/en/function.str-contains.php>

Você pode estar lendo a RFC sobre essa função para poder verificar todas suas características.

**Exemplo**

1. str_contains ( string $haystack , string $needle ) : bool

No código acima será realizada a verificação para indicar se a string $needle está presente dentro da string $haystack . Se sim retorna true caso contrário retornará false.

## Funções str_starts_with() e str_ends_with()

Estas funções tem o funcionamento semelhante a **str_contains()** no entanto elas verificam se um string começa ou termina com determinada string, economisando o uso da CPU já que não será necessário percorrer toda a string.

Alem do funcionamento a syntaxe também é semelhante com a função str_contains.

1. str_starts_with (string $haystack , string $needle) : bool

2. str_ends_with (string $haystack , string $needle) : bool


