# Atualização PHP 7.2 para PHP 7.4

# Material de consulta


Migrando do PHP 7.2.x para o PHP 7.3.x (opens new window)

Migrando do PHP 7.3.x para o PHP 7.4.x (opens new window)

# Dependências e Módulos

# Zeedhi Angular

composer.json bower.json modules.json
teknisa/libraries: 3.4.* tek-libraries: 3.4.* LOGIN: 4.5.*
zeedhi/framework: 2.6.* ACL: 2.7.*

# Zeedhi Next

composer.json package.json modules.json
teknisa/libraries-next: 2.3.* zeedhi/tek-lib: 2.3.* LOGIN: 1.8.*
zeedhi/framework: 2.7.* ACL: 1.5.*

Dica

As versões acima funcionam tanto no PHP 7.2 quanto no PHP 7.4.

Atenção

Como todos já irão alterar o composer.json, removam todas as parametrizações de repositórios git que já existam no CDN (opens new window), contidas na propriedade repositories. Caso utilize alguma dependência de repositório que não exista no CDN (opens new window), matenha a configuração. Em breve, durante a migração das dependências para o GitLab, não poderá existir endereços apontando para o code. Exemplo de como deve ficar abaixo:

"repositories": [
    {
        "type": "composer",
        "url": "http://cdn.zeedhi.com/composer"
    },
    {
        "packagist": false
    }
]

Adicionem na propriedade config do composer.json as configurações para funcionamento em ambos ambientes (PHP 7.2 e PHP 7.4).

"config": {
    "secure-http": false,
    "platform": {
        "php": "7.4.0"
    },
    "platform-check": false
}

Atenção

Além da configuração acima, para que a versão gerada pelo DevOps funcione em ambos ambientes, sempre utilize Servidores de Pacote PHP 7.2

# Erros encontrados

  • Tentar usar valores do tipo null, bool, int, float ou resource como um array irá gerar o erro PHP Error occurred 'Trying to access array offset on value of type null' at file (...).

Exemplo:

$a = null;
$b = $a['b'];

// Resultado PHP 7.2
// $b = null

// Resultado PHP 7.4
// PHP Error occurred 'Trying to access array offset on value of type null' at file (...)

Será necessário tratar:

$a = null;
$b = isset($a['b']) ? $a['b'] : null;

Caso real encontrado na LIB (opens new window)
Na rotina de tratamento do acesso concorrente da LIB Teknisa, em casos onde o operador ainda não logou, a rotina de findAccess do código abaixo retorna null.

$userAccessHash = InstanceProvider::getMongoCache()->findAccess($criteria);
$userAccessHash = $userAccessHash['dsChaveUltAcesso'];

Foi necessário tratar:

$userAccessHash = InstanceProvider::getMongoCache()->findAccess($criteria);
$userAccessHash = isset($userAccessHash['dsChaveUltAcesso']) ? $userAccessHash['dsChaveUltAcesso'] : null;

  • Chamar get_object_vars em uma instância de ArrayObject agora sempre retornará as propriedades. Antes, era retornado os valores. Se for necessário gerar um Array a partir do ArrayObject (caso encontrado no framework), o exemplo abaixo é uma possível solução:

Código original:

foreach($cursor as $document) {
    $result[] = get_object_vars($document);
}

Alteração realizada:

foreach($cursor as $document) {
    $newDoc = array();
    foreach($document as $key => $value) {
        $newDoc[$key] = $value;
    }
    $result[] = $newDoc;
}

  • Função implode não aceita mais os parâmetros em qualquer ordem. Nos lugares onde o array é passado como primeiro parâmetro, será gerado o erro PHP Error occurred 'implode(): Passing glue string after array is deprecated. Swap the parameters'.

Exemplo:

$a = array('a', 'b', 'c');
$b = implode($a, ',');

// Resultado PHP 7.2
// $a = 'a,b,c';

// Resultado PHP 7.4
// PHP Error occurred 'implode(): Passing glue string after array is deprecated. Swap the parameters'

Alterar para:

$a = array('a', 'b', 'c');
$b = implode(',', $a);

Nota

O implode() pode, por razões históricas, aceitar seus parâmetros nas duas ordens para consistência com explode(). Entretando, ela pode ser menos confusa por usar a ordem documentada dos argumentos. (Fonte: Manual do PHP (opens new window)).

# A mágica não funciona mais! Deve-se fazer do jeito correto.

  • Utilizar array_key_exists em objetos irá gerar o erro Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead.

Exemplo:

$obj = new stdClass();
$obj->b = 'b';
array_key_exists('a', $obj);

// Resultado PHP 7.2
// false

// Resultado PHP 7.4
// PHP Error occurred 'Using array_key_exists() on objects is deprecated. Use isset() or property_exists()'

Foi criada uma função no framework para solução 👍

$obj = new stdClass();
$obj->b = 'b';
\Zeedhi\Framework\Util\Functions::arrayKeyExists('a', $obj);

Nota

Essa função funciona tanto para objetos quanto arrays. Logo, um "replace in path" poderá resolver esse problema.

Nota

O isset não atende totalmente esse caso pois retorna false quando a propriedade existe mas possui valor null. Já o property_exists não funciona com array, apenas com objetos_.


  • Extra: Houveram alterações de comparação utilizando objetos DateInterval que podem gerar inconsistência em algum momento. Nesse caso, não encontramos problemas na LIB ou framework, mas é válido executar um find no projeto. Consulte a documentação do PHP para mais informações.