8771 sujets

Développement web côté serveur, CMS

Bonjour à tous
Je m'y prends un peu trop tard, mais je suis amené à passer un site de PHP7 à PHP8.
Je découvre avec stupeur que pratiquement tous mes programmes sont à réécrire car PHP8 impose que les clés des tableaux ou les propriétés des objets soient pré-déclarés.
Dans mon code actuel j'écris souvent des choses comme

$value = $TABLE[$key];
if(is_null($value)) $TABLE[$key] = $value = $defaultValue;

Apparemment il faut écrire

if(isset($TABLE[$key]) $value = $TABLE[$key];
else $TABLES[$key] = $TABLE[$key] = $value = $defaultValue;

auriez vous un guide de "comment passer de PHP7 à PHP8 ?
Modérateur
Bonjour,

Normalement, il n'y a rien à faire sauf dans quelques rares cas particuliers qu'il est peu probable que tu rencontres.

La plupart des différences sont des fonctionnalités nouvelles en php8 (donc a priori, elles ne doivent pas poser de problèmes de migration).

Il n'y a pas à paniquer. Corrige le problème que tu viens de détecter (qui n'aurait jamais dû exister et qui est la conséquence d'une mauvaise pratique). Ça devrait suffire !

Amicalement,
Merci de ta réponse
Corriger "le problème que je viens de détecter" m'oblige pratiquement à réécrire toutes les pages php de mon site!!!
J'espère que je ne vais pas trouver d'autre zombies du même type, car j'ai un autre site qu'il faudra migrer un jour et qui contient une bonne centaine de pages php.
Je suis arrivé à contourner les problèmes d'entrées des Array, mais comment faire pour les objets? Il semble que si une propriété n'a pas été explicitement définie par "var $toto" il n'y a pas moyen d'ajouter une nouvelle propriété dynamiquement.
Est-ce exact ?
Sinon je suis passé par

class MaClasse {
   var $items = []
}

et j'ai modifié le code pour que ce qui était précédemment des propriétés soient maintenant des entrées de $this -> items :
au lieu de

$this -> firstName = "Michel";

je fais

$this -> items['firstName'] = "Michel";

Un peu désagréable.

Et comment utilise-t-on stdClass ? Les stdClass n'ont pas de section de définition de propriétés.
Actuellement j'ai pas mal de code

$simpleObject = new stdClass;
foreach(['a','b', "c] as $item) $simpleObject -> $item = $this -> $item;

Je ne crois pas que je puisse toujours cette technique.
Il faudra sans doute faire quelque chose comme

$simpleTable = [];
foreach(['a','b', "c] as $item) $simpleTable[$item] = $this -> $item;
$simpleObject = (object) $simpleTable;


Je pensais faire la migration en quelques heures, j'estime maintenant qu'il va me falloir des mois.
Modérateur
Bonjour,

J'avoue ne pas comprendre ton problème.

Le code ci-dessous me semble fonctionner sans problème :
class MaJolieClasse{}
$c = new MaJolieClasse();
$c->a = 'erf';
echo $c->a;

Amicalement,
Merci pour cet exemple.
Dans un cas similaire j'ai un message disant qu'on ne peut pas mettre une valeur à une propriété qui n'est pas définie.
Dans ton exemple, il faudrait écrire :

class MaJolieClasse{
    var $a;
}
$c = new MaJolieClasse();
$c->a = 'erf';
echo $c->a;

je vais regarder de plus près.

<?php
	$root = $_SERVER['DOCUMENT_ROOT'];
	class Example {
		function __construct($data) {
			foreach($data as $item => $value) $this -> $item = $value;
			print_r($this);
		}
	}
	$data = new stdClass;
	$data -> a = "A";
	$data -> b = "B";
	
	$ex = new Example($data);
?>


Messages d'erreur reçus :
a écrit :

Deprecated: Creation of dynamic property Example::$a is deprecated in /home/clients/c0c10f976bd6b99226c134a1a82dd818/web/tests/tests1/php-test.php on line 5

Deprecated: Creation of dynamic property Example::$b is deprecated in /home/clients/c0c10f976bd6b99226c134a1a82dd818/web/tests/tests1/php-test.php on line 5
Example Object ( [a] => A => B )
Mon code

<?php
	$root = $_SERVER['DOCUMENT_ROOT'];
	class Example {
		function __construct($data) {
			foreach($data as $item => $value) $this -> $item = $value;
			print_r($this);
		}
	}
	$data = new stdClass;
	$data -> a = "A";
	$data -> b = "B";
	print_r($data);
	
	$ex = new Example($data);
?>

Affichage :
a écrit :

stdClass Object ( [a] => A => B )

Deprecated: Creation of dynamic property Example::$a is deprecated in /home/clients/c0c10f976bd6b99226c134a1a82dd818/web/tests/tests1/php-test.php on line 5

Deprecated: Creation of dynamic property Example::$b is deprecated in /home/clients/c0c10f976bd6b99226c134a1a82dd818/web/tests/tests1/php-test.php on line 5
Example Object ( [a] => A [b] => B )

Ce qui semble dire qu'on peut créer des propriétés depuis l'extérieur de la classe mais pas depuis l'intérieur de la classe
Smiley confus
[/b]
Modérateur
Bonjour,

1) C'est quelle version de php 8 que tu utilises ?

2) Essaie $this -> {$item} au lieu de $this -> $item à la ligne 5

Amicalement,
Modérateur
Bonjour,

Et rajoute #[\AllowDynamicProperties] juste avant class Example { si tu es en php 8.2.0 ou postérieur. Le code devient :

<?php
	$root = $_SERVER['DOCUMENT_ROOT'];
	#[\AllowDynamicProperties]
	class Example {
		function __construct($data) {
			foreach($data as $item => $value) $this -> {$item} = $value;
			print_r($this);
		}
	}
	$data = new stdClass;
	$data -> a = "A";
	$data -> b = "B";
	print_r($data);
	
	$ex = new Example($data);
?>

Amicalement,
Modifié par parsimonhi (20 Apr 2023 - 09:37)
Meilleure solution
Merci, ça fonctionne

Si je comprends bien il faut ajouter #[\AllowDynamicProperties] devant chaque classe de ce type ?

Je suis en train de passer le site de PHP7.3 à PHP8.2
Pour l'instant, le site de tests est sous PHP8.2, le site officiel en PHP7.3

Que se passe-t-il si j'écris #[\AllowDynamicProperties] dans un programme qui est exécuté avec PHP7.3 ?
Modérateur
Bonjour,
PapyJP a écrit :
Si je comprends bien il faut ajouter #[\AllowDynamicProperties] devant chaque classe de ce type ?
Oui ! La directive ne s'applique qu'à la classe qui la suit immédiatement.
PapyJP a écrit :
Que se passe-t-il si j'écris #[\AllowDynamicProperties] dans un programme qui est exécuté avec PHP7.3 ?
Normalement, ça ne devrait pas avoir de de conséquences négatives en PHP7.x. J'ai fait quelques tests en php 7.4.33 et ça semble fonctionner.

Amicalement,
OK merci, ça me tire une énorme épine du pied!
Je vais pouvoir faire la migration beaucoup plus facilement.
Les attributs comme #[\AllowDynamicProperties] ou même les annotations comme

/**
 * Description de la fonction
 * 
 * @param bool $value 
 * @return mixed 
 */
function maFonction($value) {
    return;
}


seront interprétées comme des commentaires s'ils ne sont pas pris en charge. Les annotations seront alors considérées comme des commentaires multilignes /* ... */ et les annotations de PHP 8 comme des commentaires de type shell # ...

Donc normalement pas d'inquiétude à avoir Smiley smile
Modifié par Loraga (20 Apr 2023 - 20:35)