Raketenmechaniker: Deprecated: Array and string offset access syntax with curly braces is deprecated in php

Beitrag lesen

Verschachtelte Indexausdrücke $a{2+$b{$c}} dürften gelingen, aber nur in 2 Durchläufen.

Jau. Genau das ist mir bei weiteren Tests aufgefallen… Sogar die Idee mit dem zweiten Durchlauf kam auch mir.

Das folgende behebt dieses Problem und führt mit den Resultaten einen Syntax-Test durch, bevor diese übernommen werden. Ein Backup wird dennoch erzeugt.

(Soweit zum "Ein- bis Drei-Zeiler" …)

#!/bin/bash
### php73to74.sh

### Diese Zeile muss angepasst werden!
phpcli='/usr/bin/php74/bin/php-cli';
###

file=$1;

if [ -z "${file}" ]; then
	echo "Keine Datei angegeben. Exit!" 2>&1; 
	exit 1;

elif [ -f "${file}]" ]; then
	echo "'${file}' ist keine Datei. Exit!" 2>&1;
	exit 2;

elif [ ! -r "${file}" ]; then
	echo "'${file}' ist nicht lesbar. Exit!" 2>&1;
    exit 4;

elif [ ! -w "${file}" ]; then
    echo "Keine Schreibrechte an '${file}' Exit!" 2>&1;
    exit 8;
fi

if [ ! -f "${phpcli}" ] && [ ! -x "${phpcli}" ]; then
	echo "phpcli ('${phpcli}') ist falsch. Exit!" 2>&1;
    exit 8;
fi

tmpfile1=`mktemp`;
tmpfile2=`mktemp`;
backupfile="${file}-`date +%Y%m%d_%H%M`";


sed -E -e 's/\$([a-zA-Z0-9_]+)\{([^\}]*)\}/\$\1[\2]/g' "${file}" > "${tmpfile1}";
$phpcli -l "${tmpfile1}" 1>/dev/null 2>/dev/null;
if [ 0 -eq $? ]; then
	cp "${file}" "${backupfile}";
	cp "${tmpfile1}" "${file}";
	echo "Erfolg: '${file}' umgewandelt. Backup in '${backupfile}'."  2>&1;
	rm -f "${tmpfile1}" "${tmpfile2}";
	exit 0;
else
	sed -E -e 's/\$([a-zA-Z0-9_]+)\{([^\}]*)\}/\$\1[\2]/g' "${tmpfile1}" > "${tmpfile2}";
	$phpcli -l "${tmpfile2}" 1>/dev/null 2>/dev/null;
	if [ 0 -eq $? ]; then
	    cp "${file}" "${backupfile}";
        cp "${tmpfile2}" "${file}";
        echo "Erfolg: '${file}' umgewandelt. Backup in '${backupfile}'."  2>&1;
		rm -f "${tmpfile1}" "${tmpfile2}";
		exit 0;
	fi
fi
echo "Misserfolg: '${file}' konnte nicht erfolgreich umgewandelt werden.";
echo "Grund:";
err=`$phpcli -l "${file}" 1>/dev/null 2>&1`;
if [ 0 -ne $? ]; then
	echo "'${file}' enthält folgenden Fehler:";
	echo $err;
	rm -f "${tmpfile1}" "${tmpfile2}";
	exit 16;
fi
err=`$phpcli -l "${tmpfile1}" 2>&1`;
if [ 0 -ne $? ]; then
    echo "Erster Umwandlungsversuch führte zu folgendem Fehler:";
    echo $err;
fi
err=`$phpcli -l "${tmpfile2}" 2>&1`;
if [ 0 -ne $? ]; then
    echo "'Zweiter Umwandlungsversuch führte zu folgenden Fehler:";
    echo $err;
fi
rm -f "${tmpfile1}" "${tmpfile2}";
exit 16;

Zu exekutieren mit:

find -name *.php -print0 | xargs -0 /PFAD/ZU/php73to74.sh > php73to74.log

Es verbleiben:

Indexzugriffe auf Funktionsergebnisse werden wohl auch ignoriert, aber so was ist selten und kann von Hand passieren.

und:

Whitespace zwischen Variable und { führt ebenso zur Nichterkennung, das ist aber je nach deinem Coding Style irrelevant.

Von beiden lass ich (vorerst) die Finger, weil ich befürchte, da mehr einzureißen als zu reparieren. Ich hab ja das Logfile...