$el = array_shift($instance->find(..))
Der obige Code meldet irgendwie die strenge Standardwarnung, aber dies wird nicht:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Wann wird die Warnung überhaupt gemeldet?
$el = array_shift($instance->find(..))
Der obige Code meldet irgendwie die strenge Standardwarnung, aber dies wird nicht:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Wann wird die Warnung überhaupt gemeldet?
get_arr()
Funktion) hat den strengen Standards Hinweis (getestet PHP 5.2 und PHP 5.5) erzeugen.
Antworten:
Betrachten Sie den folgenden Code:
error_reporting(E_STRICT);
class test {
function test_arr(&$a) {
var_dump($a);
}
function get_arr() {
return array(1, 2);
}
}
$t = new test;
$t->test_arr($t->get_arr());
Dadurch wird die folgende Ausgabe generiert:
Strict Standards: Only variables should be passed by reference in `test.php` on line 14
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
Der Grund? Die test::get_arr()
Methode ist keine Variable und im strengen Modus wird eine Warnung generiert. Dieses Verhalten ist äußerst unintuitiv, da die get_arr()
Methode einen Array-Wert zurückgibt .
Um diesen Fehler im strengen Modus zu umgehen, ändern Sie entweder die Signatur der Methode, sodass keine Referenz verwendet wird:
function test_arr($a) {
var_dump($a);
}
Da Sie die Signatur von nicht ändern array_shift
können, können Sie auch eine Zwischenvariable verwenden:
$inter = get_arr();
$el = array_shift($inter);
current
wird davon ausgegangen, dass sich der Array-Zeiger am ersten Element befindet. In den meisten Fällen kann dies eine gültige Annahme sein, auf die Sie jedoch achten sollten.
array_shift()
erwartet wird, dass ein Verweis
$intermediate
Wert vermeiden, indem Sie ein zusätzliches Klammerpaar verwenden. $el = array_shift( ( get_arr() ) );
. Siehe stackoverflow.com/questions/9848295/…
$instance->find()
Gibt einen Verweis auf eine Variable zurück.
Sie erhalten den Bericht, wenn Sie versuchen, diese Referenz als Argument für eine Funktion zu verwenden, ohne sie zuvor in einer Variablen zu speichern.
Dies hilft, Speicherlecks zu vermeiden und wird wahrscheinlich in den nächsten PHP-Versionen zu einem Fehler.
Ihr zweiter Codeblock würde einen Fehler auslösen, wenn er wie folgt geschrieben würde (beachten Sie die &
in der Funktionssignatur):
function &get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Eine schnelle (und nicht so schöne) Lösung wäre also:
$el = array_shift($tmp = $instance->find(..));
Grundsätzlich weisen Sie zuerst eine temporäre Variable zu und senden die Variable als Argument.
array_shift($tmp = $instance->find(..))
weist den Wert von $instance->find(..)
zu $tmp
und übergibt dann den Wert der Zuweisung an array_shift()
- was nicht dasselbe ist wie das Übergeben $tmp
selbst, also nicht besser als die ursprüngliche Situation ohne die Zuweisung.
Die Fehlerursache ist die Verwendung der internen PHP-Programmierdatenstrukturfunktion array_shift () [php.net/end].
Die Funktion verwendet ein Array als Parameter. Obwohl im Prototyp von array_shift()
im Handbuch ein kaufmännisches Und angegeben ist , gibt es in der erweiterten Definition dieser Funktion weder eine Warnhinweisdokumentation noch eine offensichtliche Erklärung dafür, dass der Parameter tatsächlich als Referenz übergeben wird.
Vielleicht ist das / verstanden /. Ich habe es jedoch nicht verstanden, daher war es für mich schwierig, die Fehlerursache zu ermitteln.
Code reproduzieren:
function get_arr()
{
return array(1, 2);
}
$array = get_arr();
$el = array_shift($array);
Dieser Code:
$monthly_index = array_shift(unpack('H*', date('m/Y')));
Muss geändert werden in:
$date_time = date('m/Y');
$unpack = unpack('H*', $date_time);
array_shift($unpack);
Das zweite Snippet funktioniert auch nicht und deshalb.
array_shift
ist eine Modifikatorfunktion, die ihr Argument ändert. Daher wird erwartet, dass sein Parameter eine Referenz ist, und Sie können nicht auf etwas verweisen, das keine Variable ist. Siehe Rasmus 'Erklärungen hier: Strenge Standards: Nur Variablen sollten als Referenz übergeben werden
In solchen offensichtlichen Fällen können Sie PHP jederzeit anweisen, Nachrichten zu unterdrücken, indem Sie "@" vor der Funktion verwenden.
$monthly_index = @array_shift(unpack('H*', date('m/Y')));
Es ist möglicherweise nicht die beste Programmierpraxis, alle zu unterdrücken Fehler auf diese Weise , aber in bestimmten Fällen (wie diesem) ist es praktisch und akzeptabel.
Daher bin ich sicher, dass Ihr Freund "Systemadministrator" mit einem weniger verschmutzten zufrieden sein wird error.log
.