Accueil > Forum > > > > PHP4 - PHP5 : Compatibilité ?
PHP4 - PHP5 : Compatibilité ?
lundi 12 octobre 2009 à 16:25:35 |
PHP4 - PHP5 : Compatibilité ?

jack
|
Salut
Me voilà dans un langage que je ne maîtrise pas du tout.
J'ai actuellement un petit site créé en PHP4.
Mon hébergeur veut me faire passer en PHP5.
Déjà, première intérogation : Les pages en version 4 sont-elles compatibles avec la 5 ?
Ce basculement impose t-il une refonte importante du code existant ?
Pour faire mes essais, mon hébergeur suggère de basculer le port 80 vers le port 81. Soit.
Mes premiers pas tombent sur le problème :
Dans mon fichier "functions-site.inc", le serveur bute sur cette ligne
Code PHP : function commonsetup() {
@session_start();
$interface = & new interface($globals['interfaces'][0]['maquette']);
qui me renvoie l'erreur suivante :
Parse error: syntax error, unexpected T_INTERFACE, expecting T_STRING or T_VARIABLE or '$' in /home/local/apache/ [...] /require/functions-site.inc on line 100
Je remarque cette même structure de ligne un peu partout dans le code :
Y a t-il une nouvelle syntaxe autour de ce = & new (dont je ne comprends pas le sens, d'ailleurs)
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
|
|
lundi 12 octobre 2009 à 17:10:31 |
Re : PHP4 - PHP5 : Compatibilité ?

jack
|
Ah, je suis sur une piste : "interface" est devenu un mot clé du langage 5
|
|
lundi 12 octobre 2009 à 20:00:39 |
Re : PHP4 - PHP5 : Compatibilité ?

jack
|
Bon, après avoir tenté de remplacer le mot " interface" (réservé PHP5) par " clsInterface", j'obtiens maintenant l'erreur suivante :
Fatal error: Cannot re-assign $this in /home/.../classes/interface.inc(54) : runtime-created function on line 1
La ligne 54 est le ; de fin de syntaxe d'une function maintenant nommée clsInterface.
Ce qui m'intrigue dans la syntaxe PHP (que je ne comprends pas tjrs), c'est que ma Classe et ma Function portent le même nom, " interface" renommée en " clsInterface".
De plus, dans les autres fichiers du site, on trouve ceci ce genre de syntaxe :
$GLOBALS['interfaces'][0]['maquette'] = ...
c'est à dire, encore un " interface" mais cette fois-ci avec un S final
Comment s'y retrouver ... parce qu'il y a aussi le nom du fichier " interface.inc" auquel je n'ai pas touché.
Pour moi, pas clair tout ça ...
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
|
|
lundi 12 octobre 2009 à 20:22:10 |
Re : PHP4 - PHP5 : Compatibilité ?

neigedhiver
|
Salut,
C'est pas évident comme ça de te dire ce qui va pas... Si tu nous montrais un peu de code (après tout, t'es bien torse poil sur la photo, tu peux bien faire ça !) on pourrait sûrement te donner plus d'informations. Notamment le fichier interface.inc ;)
Le mot interface n'est gênant que quand il peut être confondu avec le mot clé interface. Une chaîne, une variable, avec un s, un nom de fichier, tout ça sont des cas qui ne posent pas de problème. Par contre, je suis vraiment curieux de voir ton code qui produit cette belle erreur, ne serait-ce que pour ma culture générale
--
Neige
N'hésitez pas à lire la doc
|
|
lundi 12 octobre 2009 à 20:36:01 |
Re : PHP4 - PHP5 : Compatibilité ?

jack
|
lol, merci pour ton message.
J'espère que ma nudité ne t'a pas choqué ...
Voilà the code :
Code PHP : $globals['clsinterface'] = null;
function getmicrotime() {
list($usec, $sec) = explode(" ",microtime());
return ($usec+$sec);
}
class clsinterface {
var $maquette;
var $variables = array();
var $start;
// menu locator
var $locator;
// boutton
var $maquettebtn;
function clsinterface ($file) {
if (!file_exists($file)) {
die('un problème d\'ordre majeur s\'est produit');
}
$this->locator = array();
$this->locator['niveau'] = 0;
// création de la function de flush :
$flushsite = create_function('$str','
$this = & $globals["clsinterface"];
$this->variables["[body]"] = $str;
$this->variables["[exectime]"] = round(getmicrotime()-($this->start),4);
$this->variables["[locator]"] = $this->locator["start"].$this->locator["string"];
return str_replace(array_keys($this->variables),
array_values($this->variables),$this->maquette);
');
$this->start = getmicrotime();
// chargement de la maquette
$this->maquette = file_get_contents($file);
$globals['clsinterface'] = & $this;
ob_start($flushsite);
}
Désolé, toutes les majuscules partent au lavage dans les balises de Code
|
|
lundi 12 octobre 2009 à 21:08:53 |
Re : PHP4 - PHP5 : Compatibilité ?

neigedhiver
|
Mouais... Je suis pas habitué à create_function() n'ayant jamais vraiment compris dans quel cas on pouvait vraiment en avoir besoin...
Il semble que PHP n'aime pas que tu utilises :
$this =
dans le code de ta fonction créée à la volée.
En fait, j'imagine que pour PHP, le contexte d'exécution est au sein de la classe, donc quand il exécute cette fonction anonyme, $this est déjà défini et n'est autre que l'instance de la classe qui exécute cette fonction (suis-je clair ?)
Bref... j'ai comme l'impression que ce que tu essayes de faire, c'est un singleton... Si j'ai bon, dis-le moi, je te proposerai d'implémenter ce design pattern qui est mon préféré pour cette classe qui te tient tant à coeur.
P.S. : Ouais, alors ces capitales qui foutent le camp dans chaque morceau de code, ça me gonfle quelque chose de bien, là... J'en ai même fait un message à ... euh je sais pas, j'ai utilisé le formulaire de contact... Mais vraiment, c'est casse bonbon...
--
Neige
N'hésitez pas à lire la doc
|
|
mardi 13 octobre 2009 à 09:52:34 |
Re : PHP4 - PHP5 : Compatibilité ?

kohntark
|
Salut,
Perso je casserai tout et repartirai du début
Je n'ai pas bien saisi le but de la classe, peux tu en dire plus ???
Ca me semble en tous cas fort complexe. Il est sans doute possible de simplifier grandement.
Je suis de l'avis de Neige :
$this = ... il n'aime pas. Même chose pour &$this. J'ai l'impression également que certaines variables ne sont pas définies, ... et je doute de la nécessité de la fonction anonyme (idem pour getmicrotime())
c'est que ma Classe et ma Function portent le même nom
Il s'agit du constructeur en PHP4 ( cf doc) qui équivaut à __construct() en PHP5
Cordialement,
Kohntark -
|
|
mardi 13 octobre 2009 à 12:04:25 |
Re : PHP4 - PHP5 : Compatibilité ?

jack
|
Merci mille fois de vous pencher sur mon cas, j'aprécie.
Je ne l'ai pas précisé, mais ce code marche parfaitement en version 4.
Donc je pense que s'il manquait des définitions, je serais déjà embété.
Bon, comme il faut une vue d'ensemble du code, qu'un forum n'est pas l'endroit rêvé et surtout que je ne suis pas assez instruit dans ce langage pour apporter les réponses, je vais m'en remettre aux pros pour revoir l'ensemble.
Si vraiment vous aviez du temps à perdre, je peux vous transmettre le zip (454ko), mais ce que je voulais surtout, c'était savoir si ce n'était pas qu'une banale histoire de virgule ou un problème de structure : j'ai ma réponse.
NeigeDHiver, Kohntark : merci beaucoup pour ces indications.
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
|
|
mardi 13 octobre 2009 à 12:56:27 |
Re : PHP4 - PHP5 : Compatibilité ?

neigedhiver
|
Non, ce n'est pas qu'un problème de virgule ;)
PHP5 a apporté BEAUCOUP de nouveautés pour tout ce qui concerne la gestion des objets. Je ne m'étais jamais posé la question du contexte d'exécution d'une fonction anonyme dans un constructeur (c'est quand même bien spécifique, hein !), mais ton exemple le montre bien : une fonction anonyme, même définie avec des guillemets simples n'empêche pas PHP5 de considérer $this comme référence à l'objet "courant".
Je ne sais pas si l'intégralité du code est nécessaire. Si ta classe est bien un singleton, alors ce n'est qu'au niveau du constructeur que cela se joue. Voici un exemple rapide de comment implémenter ça :
Code PHP : <?php
class clsinterface {
private static $instance;
public static function getinstance($file = NULL) {
if (null === $file && null === self::$instance) {
throw new Exception('File is required to create a new instance');
}
null === self::$instance or self::$instance = new self($file);
return self::$instance;
}
private function __construct($file) {
if (!file_exists($file)) {
throw new Exception("Le fichier $file n'existe pas");
}
}
}?>
Attention, il y a des majuscules... : clsInterface, Exception et getInstance (bon, seule la majuscule à Exception est indispensable, car définie comme ça en interne par PHP)
Pour ce qui est de ta fonction anynyme, je ne comprends pas pourquoi tu utilises une fonction anonyme. En fait, ouais, plus j'y pense, plus je me dis que je ne comprends pas dans quel cas on peut vraiment avoir besoin d'une fonction anonyme...
Dans ton cas présent, tu pourrais avoir simplement une méthode de ton objet :
Code PHP : public function flush($str) {
$this->variables["[body]"] = $str;
$this->variables["[exectime]"] = round(getmicrotime()-($this->start),4);
$this->variables["[locator]"] = $this->locator["start"].$this->locator["string"];
return str_replace(array_keys($this->variables), array_values($this->variables),$this->maquette);
Et voici ton constructeur, avec ob_start() :
Code PHP : private function __construct($file) {
if (!file_exists($file)) {
throw new Exception("Le fichier $file n'existe pas");
}
ob_start(array($this, 'flush'));
}
P.S. : il est vraiment idiot cet éditeur, non seulement il supprime les majuscules dans un langage sensible à la casse, mais en plus si le code ne commence pas par <? il ne sait plus coloriser... Bien la peine de lui indiquer le langage dans la balise code... :/
--
Neige
N'hésitez pas à lire la doc
|
|
mardi 13 octobre 2009 à 13:00:57 |
Re : PHP4 - PHP5 : Compatibilité ?

neigedhiver
|
En fait... Non, rien d'absurde... C'est lors de l'exécution de la fonction anonyme, au moment du vidage du tampon (ob_get_* ou ob_end_flush) la fonction anonyme est exécutée, et il n'est pas possible alors de redéfinir $this. Oui, c'est que c'est pas une construction naturelle, ton truc là... Donc peut-être que pour PHP4 cette fonction anonyme n'a simplement pas le même contexte d'exécution (et peu importe en fait que celle-ci soit définie avec des guillemets simples ou doubles, ce n'est pas au moment de la définition que $this est interprété, mais bien au moment de l'exécution).
Il n'en reste pas moins que le code que je te propose me paraît plus clair que le tien ;)
J'ai oublié de préciser, mais le singleton ne s'instancie pas directement, il faut appeler :
Code PHP : $interface = clsinterface::getinstance('/path/to/my/file.ext');
--
Neige
N'hésitez pas à lire la doc
|
|
Cette discussion est classée dans : site, code, interface, color, php4
Répondre à ce message
Sujets en rapport avec ce message
Hébergeur ASP/PHP4 [ par xav ]
J'ai trouvé un hébergeur qui fait de l'asp/php4, c'est webcentrale.com. Leurs prix sont tout à fait raisonnables et je suis vraiment très content de l
Variable dans une session [ par RockmanX ]
Voila,je voudrais stocker des données dans une session nommée session_user qui s'ouvre à la suite d'un formulaire de login si le mot de passe et le no
ticket a grater [ par thmtd ]
c'est un jeu, je pense un truck avec tirage aléatoire contenant un code php et un source en c (code) pour des sockets en plus il faut faire aussi
Image sur click .. [ par nicolas66 ]
Bonsoir @ tous !Je voulais juste savoir comen il était possible d'afficher une image créee avec php dans la meme page ou il y a un formulaire sur clic
[php] Redirection [ par Trigun222 ]
Salut,j'aimerais savoir comment modifier ce codeset_time_limit(0);sleep(3600);header("location: http://www.monsite.com/mapage.php/");?> pour que la pa
mise en forme phpbb [ par mozrat ]
Bonjour,je cherche à insérer phpbb dans mon site :je m'explique, j'aimerais avoir la page du forum sous la forme :inclu
XHTML [ par gibozsec ]
Bonjour à tous,ma question ne concerne pas php mais puisqu'il y a des développeur web ici quelqu'un pourra peut etre me répondre.J'ai un problème en x
Optimiser mes sources [ par xander09 ]
Bonsoir,J'ai un site web ouvert depuis le 24 janvier 2004 et ce soir à 18H je ne pouvais plus y acceder. L'hebergeur m'a envoyé ce mail :Bonsoir, Nous
comment placer un javaxcript dans un site phpnuke [ par naturelj ]
natureljcomment placer un javaxcript dans un site phpnukedans quel fichier placer la source du code?doit t'on changer le code pour qu'il fonctionne en
mot de passe [ par stequer ]
voila je rechecher un srcipt pour securiser ma parti menbre de mon site j ai deja une base de donner pseudo et code pour la gestion des utilisateur et
Livres en rapport
|
Derniers Blogs
ROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGEROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGE par Matthieu MEZIL
Si vous utilisez Roslyn et que vous vous voulez vous simplifier le code du code rewriter, je vous conseille d'installer mon NuGet package RoslynHelper ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|