2012-04-11 8 views
0

Wir haben zwei Validierungsfunktionen codiert, ist ein unten wie (es wird alle Felder auf einmal):

function check_fields(&$arr,&$msg,$types,$lens,$captions,$requireds) {} 

und die andere Funktion ist so etwas wie unten:

function is_valid($field=NULL,$type=0 ,$length=0,$required=true) {} 

Erste Funktion ein paar Codezeilen und reduziert Codezeilen dramatisch (etwa 30-35 Zeilen oder mehr), auf der anderen Seite erhöht die zweite Funktion ohne Referenz die Codezeilen (etwa 30-35 Zeilen oder mehr).

Wir müssen die zweite Funktion für jedes Feld, das wir validieren wollen, aufrufen, aber die erste Funktion (check_fields) ist umgekehrt. Ich habe in einem Artikel vor langer Zeit gelesen, dass Funktionen mit Referenzparametern aus Sicht der Leistung schlecht sind.

Jetzt wissen wir nicht, welche Funktion zu verwenden ist. Welche ist aus Performance-Sicht besser?

Antwort

1

Nun, ich glaube, ich habe meine Antwort selbst nach einiger Web-Suche:

Do not use PHP references

+1

was auch immer für Sie funktioniert.Wenn Sie dem richtigen OO folgen möchten, erstellen Sie eine Klasse und übergeben Sie die Instanz dieser Klasse anstelle von einem halben Dutzend Parametern. Objekte werden von ref in php5 übergeben, sodass Sie sie nach Bedarf ändern können. Verwenden Sie Typecasting, um sicherzustellen, dass die richtige Klasse übergeben wird. Meiner Meinung nach konzentrieren Sie sich auf die falschen Dinge .... wenn Sie Ihren Code optimieren möchten, konzentrieren Sie sich auf Datenbankaufrufe und Festplatten-R/W. – Alex

1

Verwenden Sie die Lösung, die einfacher zu verwenden und zu warten ist. Sie sprechen über Mikrooptimierung, die ziemlich nutzlos ist.


Verwenden Sie Referenzen, weil in Ihrem Fall ist es einfacher Lösung und erfordert weniger Code.

+0

Speziell, wenn er den Code auf eine weniger lesbare Ebene bringt, nur um eine Mikrooptimierung zu erreichen! –

+0

Das ist nicht meine Antwort, ich möchte eigentlich wissen, welche besser ist und warum, bitte sag sowas nicht als Antwort. – ALH

+0

siehe aktualisierten Beitrag. – Alex

0

dich nur daran erinnern, wenn Sie ruft:

<?php 
    $a = 1 ; 
    echo "As initial, the real 'a' is..".$a."<br/>"; 
    $b = &$a ; // it's meaning $b has the same value as $a, $b = $a AND SO $a = $b (must be) 
    $b += 5; 
    echo "b is equal to: ".$b." and a equal to: ".$a."<br/>"; 
    echo " Now we back as initial, when a=1... (see the source code) <br/>"; 
    $a = 1 ; 
    echo "After we back : b is equal to: ".$b." and a equal to: ".$a."<br/>"; 
    echo "Wait, why b must follow a? ... <br/> ..what about if we change b alone? (see the source code)<br/>"; 
    $b = 23; 
    echo "After we change b alone, b equal to: ".$b." and a equal to: ".$a."<br/>"; 
    echo " WHAT ?? a ALSO CHANGED ?? a and b STICK TOGETHER?!! </br>" ; 
    echo "to 'clear this, we use 'unset' function on a (see the source code)<br/> "; 
    unset($a); 
    $b = 66; 
    $a = 1; 
    echo "Now, after unset,b is equal to: ".$b." and a equal to: ".$a."<br/>"; 
    ?> 

und der Ausgang wird sein:

As initial, the real 'a' is..1 
After the Reference operator...(see the source code) 
b is equal to: 11 and a equal to: 11 
Now we back as initial... (see the source code) 
After we back : b is equal to: 1 and a equal to: 1 
Wait, why b must follow a? ... 
..what about if we change b alone? (see the source code) 
After we change b alone, b equal to: 23 and a equal to: 23 
WHAT ?? a ALSO CHANGED ?? a and b STICK TOGETHER?!! 
to 'clear this, we use 'unset' function on a (see the source code) 
Now, after unset,b is equal to: 66 and a equal to: 1 

Bewertung:

Warum hat sich $a geändert? Das liegt daran, dass & (der kaufmännische Und-Operator) & als eine Referenzvariable gemacht hat und daher in einem "temporären Speicher" gespeichert wurde. Wenn Sie $b= &$a intitialized, siehe mein Kommentar $b = $aund auch $a = $b, das heißt, wenn Sie $b modifiziert wurde $a auch modifiziert, und vice versa. Sie sind verkettet! Das ist die einfache Bedeutung des Referenzoperators.

Vielleicht am Anfang fühlt es verwirrend, aber wenn Sie ein Experte mit dieser sind, können Sie diesen Operator behandeln einen „Schalten“ Funktion wie folgt zu machen:

<?php 

function bulbswitch(&$switch) 
{ 
    $switch = !$switch;  

} 

function lightbulb($a) 
{ 
    if ($a == true) { echo 'a is On <br/>';} 
    else { echo 'a is Off <br/>';} 
} 

$a = true ; 
echo 'At the begining, a is On, then.... <br/>'; 

bulbswitch($a); 
lightbulb($a); 
bulbswitch($a); 
lightbulb($a); 
bulbswitch($a); 
lightbulb($a); 
bulbswitch($a); 
lightbulb($a); 
bulbswitch($a); 
lightbulb($a); 
bulbswitch($a); 
lightbulb($a); 
?> 

Der Ausgang wird sein:

At the begining, a is On, then.... 
a is Off 
a is On 
a is Off 
a is On 
a is Off 
a is On 
+0

Ich habe versucht, dies zu bearbeiten, aber Ihre Bearbeitung überschrieb meine ... Sie müssen * nicht * normalen Text einrücken, oder alles wird als Code angezeigt. –

+0

Danke, aber jetzt bin ich es behoben .. Sehen Sie? –

+0

Nun, alles ist noch im Codeblock, also nein;) –

Verwandte Themen