Код PHP 4 дает ошибки на php 5

У меня есть код PHP 4 для проверки различий двух файлов, это отлично работает на старых серверах с версиями PHP 4, но на новых серверах я получаю ошибки. Например:

$maxlen не определен

И функционально не работает на новом сервере. Кто-нибудь знает, как изменить это для последней версии PHP?

 function diff($old, $new){ 
            foreach($old as $oindex => $ovalue){ 
                    $nkeys = array_keys($new, $ovalue); 
                    foreach($nkeys as $nindex){ 
                            $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? 
                                    $matrix[$oindex - 1][$nindex - 1] + 1 : 1; 
                            if($matrix[$oindex][$nindex] > $maxlen){ 
                                    $maxlen = $matrix[$oindex][$nindex]; 
                                    $omax = $oindex + 1 - $maxlen; 
                                    $nmax = $nindex + 1 - $maxlen; 
                            } 
                    }        
            } 
            if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new)); 
            return array_merge( 
                    diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), 
                    array_slice($new, $nmax, $maxlen), 
                    diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); 
    } 

    function htmlDiff($old, $new){ 
    $preg="/[\s,]+/";
        $old=str_replace(">","> ",$old);
        $new=str_replace(">","> ",$new);
        $old=str_replace("<"," <",$old);
        $new=str_replace("<"," <",$new);

        $diff = diff(preg_split($preg, $old),preg_split($preg, $new)); 
        foreach($diff as $k){ 
        if(is_array($k)) 
            $ret .= (!empty($k['d'])?"<div style='BACKGROUND-COLOR: red'>".implode(' ',$k['d'])."</div> ":''). 
            (!empty($k['i'])?"<div style='BACKGROUND-COLOR: yellow'>".implode(' ',$k['i'])."</div> ":''); 
            else $ret .= $k . ' '; 
        } 
        return $ret; 
    } 
    function creatediff($oldurl,$newurl,$diffurl){ 
        $sold= file_get_contents($oldurl);
        $snew= file_get_contents($newurl);
        $diff=htmlDiff($sold,$snew);
        $diff=preg_replace('#(href|src)="([^:"]*)("|(?:(?:%20|\s|\+)[^"]*"))#','$1="'.$newurl.'/$2"',$diff);
        file_put_contents($diffurl,$diff);
    }

person Salinda Bandara    schedule 06.03.2013    source источник
comment
Мануал пробовал? php.net/manual/en/faq.migration5.php   -  person Repox    schedule 06.03.2013
comment
stackoverflow.com/questions/2487021/   -  person apoq    schedule 06.03.2013
comment
Откуда вы получаете $maxlen?   -  person codingbiz    schedule 06.03.2013
comment
вышеприведенная функция получает два html-файла в качестве параметров   -  person Salinda Bandara    schedule 06.03.2013
comment
@jeroen Это не проблема области, это ошибка неинициализированной переменной.   -  person Barmar    schedule 06.03.2013
comment
$maxlen не определен раньше, но в php 4 он работает хорошо и выводит красиво форматированный вывод. php 5 получает тонны предупреждений, даже я определил выше переменные $maxlen, которые не работают правильно   -  person Salinda Bandara    schedule 06.03.2013
comment
@Barmar Правильно, я видел переменную без ссылок на нее до этого, поэтому я предположил область действия ...   -  person jeroen    schedule 06.03.2013
comment
да, но это отлично работает на php 4, но не на php 5, хм   -  person Salinda Bandara    schedule 06.03.2013


Ответы (2)


Это не из-за разницы версий, это плохой код. Вы, вероятно, отключили/отключили error_reporting при предыдущей установке, и, вероятно, поэтому вы его не видели. Вернитесь в свою среду PHP4, установите error_reporting в E_ALL, и вы, вероятно, увидите большинство тех же предупреждений.

Поскольку $maxlen определяется только при выполнении одного конкретного условия if, оно никогда не определяется в других случаях и генерирует предупреждение. Вы можете избежать этого, либо определив $maxlen в верхней части вашей функции, либо используя isset() перед попыткой сослаться на переменную.

person Sammitch    schedule 06.03.2013
comment
да, я делаю все на php 5, но не работает - person Salinda Bandara; 07.03.2013

Ваш цикл содержит:

if($matrix[$oindex][$nindex] > $maxlen)

но в первый раз в цикле $maxlen ничего не установлено, поэтому это сравнение генерирует предупреждение (а не ошибку).

Вы должны либо инициализировать $maxlen перед циклом, либо изменить его на:

if (!isset($maxlen) || $matrix[$oindex][$nindex] > $maxlen)

Другая проблема заключается в том, что в функции нет массива $matrix. Если это глобальная переменная, вам нужно:

global $matrix;

в начале функции.

person Barmar    schedule 06.03.2013
comment
я отредактировал скрипт, как это, все еще не работает с php 5 - person Salinda Bandara; 07.03.2013
comment
Вы все еще получаете предупреждение о том, что $maxlen не определено? - person Barmar; 07.03.2013