2016-05-22 4 views
-1

was ist die beste Art und Weise (Speicher sicher) verwendet call_user_func von Selbst Instanz verwenden zB .:

call_user_func(array($this, 'method')); 

oder durch Bezugnahme eingeschlossen, zB .:

call_user_func(array(&$this, 'method')); 

PS. Ich weiß, der beste Weg, $this->method ist aber für Framework-Entwurfsmuster Grund (Wordpress) i verwenden Sie call_user_func

+2

Das ist ein fragwürdiges Design-Muster ist. Ja, das ist möglich und macht in einigen sehr speziellen Fällen Sinn. Aber im Allgemeinen macht es den Code viel schwerer zu lesen (also beizubehalten) und bricht hilfreiche automatische Vervollständigung und Tippunterstützung durch moderne IDEs ein. – arkascha

+1

Ich würde sagen, es hängt wirklich von der Situation und der Komplexität ab und davon, was und wie Sie sich verhalten wollen. Ich denke (obwohl ich mir nicht ganz sicher bin), dass beide ziemlich sicher sind, da PHP intern alle Speicher verarbeitet. – JRsz

+1

Das Generieren Ihrer eigenen expliziten Referenz ist mehr Arbeit für PHP, da es nun nach Referenzzählungen suchen muss. PHP vergibt die Objekte ohnehin per Referenz. Es klont es nur, wenn Sie es in Ihrem Code ändern. siehe [PHP copy on write bedeutet ok, große Arrays nach Wert zu übergeben, wenn nur lesbar] (http://webslainte.blogspot.co.uk/2012/09/php-copy-on-write-means-ok-to-pass .html). Die Referenzen in diesem Artikel sind sehr interessant. –

Antwort

1

Wenn ich weiß, es ist nicht wirklich wichtig, weil PHP wird das gleiche in beiden Fällen tun: wird nur pass reference zu demselben Objekt (das Objekt wird nicht geklont). So Einfachheit halber würde ich gehen, ohne &

einigen Test:

class test 
{ 
    function foo() { 
     call_user_func([$this, 'bar']); 
     call_user_func([&$this, 'bar']); 
    } 
    private function bar() { 
     echo spl_object_hash($this), PHP_EOL; 
    } 
} 

und Ausgänge:

php > $obj = new test(); 
php > $obj->foo(); 
0000000025077e4a0000000075174bd2 
0000000025077e4a0000000075174bd2 
+0

im Falle eines anderen Objekts, php das Objekt klonen? –

+0

Es tut es nicht. Klasse test1 { Funktion foo (test1 $ x) { call_user_func ([$ x, 'bar']); call_user_func ([& $ x, 'bar']); } private Funktionsleiste() { echo spl_object_hash ($ this), PHP_EOL; } } php> $ obj1 = neuer test1; php> $ obj2 = neuer test1; php> $ obj1-> foo ($ obj1); 0000000025077e4d0000000075174bd2 0000000025077e4d0000000075174bd2 php> $ obj2-> foo ($ obj1); 0000000025077e4d0000000075174bd2 0000000025077e4d0000000075174bd2 – michaJlS