J'essaie de faire fonctionner certains scripts exécutés sur PHP 5.4 sur PHP 7.4. Aucune erreur de syntaxe n'a été détectée, à l'exception d'une erreur de passage par référence obsolète qui a été corrigée.
Dans certaines parties de l'application, je n'obtiens pas la valeur de retour correcte. J'ai exécuté php7cc et PHPStorm pour voir si je pouvais détecter des erreurs et des avertissements de dépréciation, mais je n'ai obtenu aucune idée de l'origine du problème.
Il existe un script qui analyse les données XML et les place dans un objet de classe. _MV_WRITE_._MV_SEP_._MV_SEP_.$this->mvKey._MV_SEP_.$this->mvObj->toString()._MV_SEP_Cette partie est correcte sauf que $item->toString() renvoie un espace au lieu de la chaîne correcte valeur.
Y a-t-il quelque chose dans ce code qui fonctionne en PHP 5.4 mais pas en PHP 7.4 ? Ci-dessous le code en question.
Script principal
<html> <head> <title>Demo MV</title> </head> <body> <?php include_once 'demo_mv.php'; include_once 'demo_xml_parser.php'; $xmltext = "<Test></Test>"; echo "Creating XML Parser. <br>"; $xp = New XMLParser(); echo "Parsing XML to MV item. <br>"; If( !$xp->ParseToMVItem( $xmltext ) ) { echo "Parsing XML item failed. <br>"; } echo "Getting formatted output. <br>"; $item = $xp->GetMVItem(); echo print_r( $item ) . "<br>"; $fv = New MVFile("123456789", $item); $mvObject = $fv->getFormattedItem( ); echo "Formatted output: " . $mvObject . "<br>"; ?> </body> </html>
Analyseur XML
<?php Class XMLParser { // set up some variables for use by the parser var $xp; // Parser var $g_level = 0; // Current XML depth var $g_amc = 0; // Current Result index var $currentTag = ""; // Name of current element var $g_elements = Array(); // Names of elements by depth var $g_result = Array(); // Result array var $errstring; // String of error message var $MVItem; // MV Item object To Parse into var $currentData = ""; // Data in current element Function XMLParser() { // Constructor } Function ParseToMVItem( $xml ) { // Initialise MV Item $this->MVItem = New MVItem(""); // create parser $this->xp = xml_parser_create(); xml_set_object( $this->xp, $this ); // set element handlers xml_set_element_handler($this->xp, "elementBegin", "elementEnd"); xml_set_character_data_handler($this->xp, "characterData"); xml_parser_set_option($this->xp, XML_OPTION_CASE_FOLDING, FALSE); // parse data if (!xml_parse($this->xp, $xml, True )) { $errstring = " Line: " . xml_get_current_line_number( $this->xp); $errstring .= " Column: " . xml_get_current_column_number( $this->xp) . "<br/>"; $errstring .= xml_error_string(xml_get_error_code($this->xp) ); $this->errstring = "XML parser error: " . $errstring ; // destroy parser xml_parser_free($this->xp); Return False; } // Success // destroy parser xml_parser_free($this->xp); Return True; } Function elementBegin($xp, $name, $attributes) { //file_log( "Attributes: " . $attributes . "rn" ); // opening tag handler $this->g_amc++; $amc = $this->g_amc; $level = $this->g_level ++; //file_log( "Level: " . $level . "rn" ); $this->g_elements[ $level -1 ] = $name; // export the name of the current tag to the global scope $this->currentTag = $name; $this->currentData = ""; // Add to MV Item $s_level = $level; settype( $s_level, "string"); $this->MVItem->replace( $s_level, $amc, 1 ); $this->MVItem->replace( $name, $amc, 2 ); $ename = $this->MVItem->extract( $amc , 2 ); // Handle attributes $attrib = ""; $index = 0; foreach ($attributes as $key => $value) { $index ++; $attrib = trim( $key . "=" . $value ); // echo $attrib . " - index=$index<br/>"; $this->MVItem->replace( $attrib, $amc, 3, $index ); // echo $this->MVItem->extract( $amc, 3, $index ) . "=attrib$index<br/>"; } } Function elementEnd($xp, $name) { // closing tag handler // echo $this->currentData; $this->MVItem->replace( trim($this->currentData), $this->g_amc, 4 ); $this->g_level --; $this->currentTag = $this->g_elements[ $this->g_level -1] ; } Function characterData($xp, $data) { // character data handler $data = Trim( $data ); If($data != '') { // echo $data . "<br />"; $this->currentData .= " ". $data; // $this->MVItem->replace( $data, $this->g_amc, 4 ); } } Function GetMVItem() { Return $this->MVItem; } } ?>
MVItem
<?php if ( ! defined( '_MV_CLASS' ) ) { define('_MV_CLASS', true ); /* * Define constants */ define('_MV_LOGIN_',1); define('_MV_LOGOFF_',2); define('_MV_EXECUTE_',3); define('_MV_CALL_',4); define('_MV_SELECT_',5); define('_MV_OPEN_',6); define('_MV_READNEXT_',7); define('_MV_READ_',8); define('_MV_READU_',9); define('_MV_WRITE_',10); define('_MV_RELEASE_',11); define('_MV_DELETE_',12); define('_MV_CLOSE_',13); define('_MV_TEST_EXIST_',14); define('_MV_LOCK_ITEM_',15); define('_MV_READV_',16); define('_MV_NOOP_',18); define('_MV_SELECT_TCL_',17); define('_MV_STATUS_',19); define('_MV_SEP_',chr(001)); define('_MV_AM_',chr(254)); define('_MV_VM_',chr(253)); define('_MV_SVM_',chr(252)); define('_MV_DIFFDATE_',732); define('_MV_DIFFTIME_',86400000); define('_MV_CONNECTION_TCP_',1); define('_MV_CONNECTION_TCP_PROXY_',2); class MVFile{ // Private var $mvKey; var $mvObj; function __construct($key, $item){ $this->mvKey = $key; $this->mvObj = $item; } function getFormattedItem(){ $this->mvKey = _MV_WRITE_._MV_SEP_._MV_SEP_.$this->mvKey._MV_SEP_.$this->mvObj->toString()._MV_SEP_; return $this->mvKey; } } // MVFile class MVItem { var $Record; var $origrec; function __construct($rec = ""){ if(empty($rec)){ $this->Record = Array(); $this->origrec = $this->Record; return; } $this->setRecord($rec); } function setRecord($newval){ $rec = explode(_MV_AM_,$newval); $nbam = count($rec); $this->Record = Array(); $this->origrec = $newval; for($am = 0;$am < $nbam;$am++) { $vam = explode(_MV_VM_,$rec[$am]); $nbvm = count($vam); $lvm = Array(); for($vm = 0;$vm < $nbvm;$vm++){ $vvm = explode(_MV_SVM_,$vam[$vm]); $lvm[$vm] = $vvm; } $this->Record[$am] = $lvm; } return true; } function toString(){ return $this->extract(); } function extract($am = 0,$vm = 0,$svm = 0) { $am --; $vm --; $svm --; //file_log( "SVM: " . $svm . "rn" ); if($vm == -1) $svm = -1; if($am == -1) { $nbam = count($this->Record); $res = ""; for($am = 0;$am<$nbam;$am++) { $nbvm = count($this->Record[$am]); $lvm = Array(); for($vm= 0;$vm<$nbvm;$vm++){ if(is_array($this->Record[$am][$vm])){ $lvm[$vm] = implode(_MV_SVM_,$this->Record[$am][$vm]); }else{ $lvm[$vm] = $this->Record[$am][$vm]; } } if(is_array($lvm) ){ $res[$am] = implode(_MV_VM_,$lvm); } else { $res[$am] = $lvm; } } if(is_array($res)) { return implode(_MV_AM_,$res); } else { return $res; } } if($vm == -1) { $nbvm = count($this->Record[$am]); $lvm = Array(); for($vm= 0;$vm<$nbvm;$vm++){ $lvm[$vm] = implode(_MV_SVM_,$this->Record[$am][$vm]); } return implode(_MV_VM_,$lvm); } if($svm == -1 ){ // MM fix undefined offset if(count($this->Record) < ( $am + 1 ) ) { //file_log("SVM = -1 rn"); return ""; } if(count($this->Record[$am]) < ( $vm + 1 ) ) { //file_log("SVM = -1 rn"); return ""; } // End Of fix return implode(_MV_SVM_,$this->Record[$am][$vm]); } else { return $this->Record[$am][$vm][$svm]; } } function replace($newval,$am = 0, $vm = 0 , $svm = 0){ if($am == 0) return; if($vm == 0) $svm = 0; for($i=count($this->Record);$i < $am;$i++){ $this->Record[$i]= Array(""); } if($vm == 0) { $this->Record[$am-1] = array($newval); }else{ for($i = count($this->Record[$am-1]);$i < $vm ; $i++){ $this->Record[$am-1][$i] = Array(""); } if($svm == 0) { $this->Record[$am-1][$vm-1] = Array($newval); }else{ for($i = count($this->Record[$am-1][$vm-1]);$i < $svm ; $i++){ $this->Record[$am-1][$vm-1][$i] = Array(""); } // $this->Record[$am-1][$vm-1][$svm-1] = Array($newval); $this->Record[$am-1][$vm-1][$svm-1] = $newval; } } } function ins(&$tab,$pos,$newval){ $fin = $tab; $nb = count($tab); array_splice($tab,-($nb-$pos),($nb-$pos)); array_splice($tab,-1,1,array($newval,"")); array_splice($fin,0,($pos-1)); array_splice($tab,-1,1,$fin); } function insert($newval, $am = 0,$vm = 0,$svm = 0){ if($am == 0) return; if($vm == 0) $svm = 0; if ($am > count($this->Record) ) { $this->replace($newval,$am); return; } if($vm == 0) { $this->ins($this->Record,$am,array($newval)); }else{ if($vm > count($this->Record[$am-1])) { $this->replace($newval,$am,$vm); return; } if($svm == 0) { $this->ins($this->Record[$am-1],$vm,$newval); }else{ for($i = count($this->Record[$am-1][$vm-1]);$i < $svm -1 ; $i++){ $this->Record[$am-1][$vm-1][$i] = Array(""); } $this->ins($this->Record[$am-1][$vm-1],$svm,$newval); } } } function delete($am = 0 ,$vm = 0,$svm = 0) { if($am == 0) return; if($vm == 0) $svm =0; if($vm == 0){ array_splice($this->Record,$am - 1,1); }else{ if($svm == 0) { array_splice($this->Record[$am-1],$vm - 1,1); }else{ array_splice($this->Record[$am-1][$vm-1],$svm - 1,1); } } } function AMCount(){ //MM //echo '<' . count( $this->Record ) . '>'; return count($this->Record); } function VMCount($am){ if ($am > count($this->Record) || $am == 0) return 0; $tmp = $this->Record[$am-1]; return count($tmp); } function SVMCount($am,$vm){ if ($am > count($this->Record) || $am == 0) return 0; $tmp = $this->Record[$am-1]; if ($vm > count($tmp) || $vm == 0 ) return 0; $tmp = $tmp[$vm-1]; return count($tmp); } } // MVItem } ?>
Voici les valeurs de retour correctes en PHP 5.4
Creating XML Parser. Parsing XML to MV item. Getting formatted output. MVItem Object ( [Record] => Array ( [0] => Array ( [0] => Array ( [0] => 0 ) [1] => Array ( [0] => Test ) [2] => Array ( [0] => ) [3] => Array ( [0] => ) ) ) [origrec] => Array ( ) ) 1 Formatted output: 101234567890�Test��
Voici les résultats que j'obtiens en PHP 7.4 :
Creating XML Parser. Parsing XML to MV item. Getting formatted output. MVItem Object ( [Record] => Array ( [0] => Array ( [0] => Array ( [0] => 0 ) [1] => Array ( [0] => Test ) [2] => Array ( [0] => ) [3] => Array ( [0] => ) ) ) [origrec] => Array ( ) ) 1 Formatted output: 101234567890
L'analyseur XML devrait fonctionner correctement car le tableau renvoyé est le même. Le vrai problème réside dans la méthode getFormattedItem(), qui n’implique en réalité que la méthode extract(). J'ai essayé d'ajouter des instructions d'impression à divers endroits, mais je n'arrive pas à déterminer quelle instruction est à l'origine du problème.
只需查看您的最终输出。我猜可能是字符集的问题。通常,新安装的 PHP 版本的 default_charset 值是 UTF-8,但旧版本可能将该值设置为 ISO-8859-1(即 latin-1),因此请检查您的 php.ini(以及可能更改字符集的项目中的其他脚本)。