# 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)
- Alterações incompatíveis com versões anteriores (opens new window) - Leitura obrigatória
- Recursos depreciados (opens new window) - Leitura importante para futuras atualizações para o PHP 8
Migrando do PHP 7.3.x para o PHP 7.4.x (opens new window)
- Alterações incompatíveis com versões anteriores (opens new window) - Leitura obrigatória
- Recursos depreciados (opens new window) - Leitura importante para futuras atualizações para o PHP 8
# 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.