我正在尝试将在PHP 5.4上运行的某些脚本在PHP 7.4上运行。除了已经修复的过时的传引用错误之外,没有检测到语法错误。
在应用程序的某个部分,我没有得到正确的返回值。我运行了php7cc和PHPStorm来查看是否可以捕捉到任何错误和过时警告,但没有任何能够解决问题的线索。
有一个脚本解析XML数据并将其放入一个类对象中。_MV_WRITE_._MV_SEP_._MV_SEP_.$this->mvKey._MV_SEP_.$this->mvObj->toString()._MV_SEP_这一部分都是正确的,除了$item->toString()返回的是空白而不是正确的字符串值。
在这些代码中是否有任何在PHP 5.4中有效但在PHP 7.4中无效的内容?以下是有问题的代码。
主要脚本
<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>
XML Parser
<?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
}
?>
以下是在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��
以下是我在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
XML解析器应该是没问题的,因为返回的数组是相同的。真正的问题在于getFormattedItem()方法,它实际上只是涉及到extract()方法。已经尝试在各个位置添加打印语句,但似乎无法确定哪个语句导致了问题。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
只需查看您的最终输出。我猜可能是字符集的问题。通常,新安装的 PHP 版本的 default_charset 值是 UTF-8,但旧版本可能将该值设置为 ISO-8859-1(即 latin-1),因此请检查您的 php.ini(以及可能更改字符集的项目中的其他脚本)。