Saya cuba membuat beberapa skrip yang dijalankan pada PHP 5.4 dijalankan pada PHP 7.4. Tiada ralat sintaks dikesan kecuali ralat lulus demi rujukan usang yang telah dibetulkan.
Dalam beberapa bahagian aplikasi, saya tidak mendapat nilai pulangan yang betul. Saya menjalankan php7cc dan PHPStorm untuk melihat sama ada saya dapat menangkap sebarang ralat dan amaran penamatan, tetapi tidak mendapat sebarang petunjuk tentang masalahnya.
Terdapat skrip yang menghuraikan data XML dan meletakkannya ke dalam objek kelas. _MV_WRITE_._MV_SEP_._MV_SEP_.$this->mvKey._MV_SEP_.$this->mvObj->toString()._MV_SEP_Bahagian ini betul kecuali $item->toString() mengembalikan rentetan yang betul nilai.
Adakah terdapat apa-apa dalam kod ini yang berfungsi dalam PHP 5.4 tetapi tidak dalam PHP 7.4? Di bawah ialah kod yang dimaksudkan.
Skrip utama
<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>
Penghurai 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 } ?>
Berikut ialah nilai pulangan yang betul dalam 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��
Berikut ialah keputusan yang saya perolehi dalam 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
Penghurai XML sepatutnya baik kerana tatasusunan yang dikembalikan adalah sama. Masalah sebenar terletak pada kaedah getFormattedItem(), yang benar-benar hanya melibatkan kaedah extract(). Telah mencuba menambah kenyataan cetak di pelbagai tempat tetapi tidak dapat menentukan pernyataan mana yang menyebabkan masalah.
只需查看您的最终输出。我猜可能是字符集的问题。通常,新安装的 PHP 版本的 default_charset 值是 UTF-8,但旧版本可能将该值设置为 ISO-8859-1(即 latin-1),因此请检查您的 php.ini(以及可能更改字符集的项目中的其他脚本)。