2016-07-21 3 views
0

PHP ist nicht meine Stärke, aber ich habe heute einige OO-Code versucht. Alles gut, außer dass mein Array $ replyArray auf globaler Ebene nicht von der Klassenmethode jumble() meines solSet-Objekts geschrieben wird. Der vorletzte var_dump in meinem Code zeigt ein leeres Array. Ich habe versucht, globale Keywords zu umwerfen, und das hat nicht geholfen. Weil ich diese Variable explizit mit Bezug auf meine neu instanziierte Klasse übergebe, sollte das nicht genug sein? Danke! kkKann keine Werte in ein globales PHP-Array von einer Klassenmethode schreiben

<?php 


//create a solution set for translation of incoming user login requests 

$widhi = 600; 
$tileDim = 25; 
$randArray = array ("0","1","2","3","4","5"); 
$replyArray = array(); 


//create 5 positions and ensure neither overlap or edge collision 
class solSet 
{ 
    var $pos1; 
    var $pos2; 
    var $pos3; 
    var $pos4; 
    var $pos5; 
    var $pos6; 


    public function jumble($wh,$ts,$arrShuf,$reply) 
    { 
    foreach($this as $key => $value) 
    { 
     $newX = rand (($ts/2),$wh - ($ts/2)); 
     $newY = rand (($ts/2),$wh - ($ts/2)); 
     $randNo = array_pop($arrShuf); 
     $value = "" . $newX . "_" . $newY . "_" . $randNo; 
     $this->$key = $value; 
     //push coords onto an array for later ajax 
     $pushElem = "" . $newX . "_" . $newY; 
     $reply[] = $pushElem; 
    } 
    } 

} 


//scramble the random number array for later popping 
shuffle($randArray); 

//make a solution object 
$aSolSet = new solSet; 
$aSolSet->jumble($widhi,$tileDim,$randArray,$replyArray); 

//store it in a session 
session_start(); 
$_SESSION["solSet"] = $aSolSet; 

echo var_dump($replyArray); 
echo json_encode($aSolSet); 

?> 

Dies scheint zu beziehen: Using a global array inside a class Aber das ist, was ich getan habe. Auch die ganze Welt und sein Hund sagen, dass das globale Schlüsselwort "es falsch macht". Was ist zu tun?

+0

Sie sind nicht wirklich * "explizit übergeben diese Variable durch Verweis" * - das wäre 'öffentliche Funktion jumble ($ wh, $ ts, $ arrShuf, & $ antworten)' – CD001

Antwort

3

Ihre jumble Methode $replyArray durch Bezugnahme nehmen muss - standardmäßig PHP-Funktionen von Wert arbeiten, was bedeutet, dass sie auf einer Kopie der Variablen arbeiten, eher als es zu modifizieren. Siehe http://php.net/manual/en/language.references.pass.php

ändern

public function jumble($wh,$ts,$arrShuf,$reply) 

zu

public function jumble($wh,$ts,$arrShuf,&$reply) 

Der Ampersand vor dem Variablennamen bedeutet, dass der Parameter als Referenz übergeben wird.

+0

Ticked, weil das genau das Problem war. Ich nahm eine Referenz an. Vielen Dank! – KolKurtz

0

Referenz die globale Array in der Funktion

global $replyArray; 
+0

Vielen Dank für Ihre Antwort. Mir wurde gesagt, dass das frech ist! – KolKurtz

1

Alternativ kann statt der globalen var innerhalb der Klasse zu aktualisieren (schlecht für die Wiederverwendung und Portabilität) können Sie einfach Ihre neue Shuffled Array zurück:

public function jumble($wh,$ts,$arrShuf) 
{ 
    $reply = array(); 
    foreach($this as $key => $value) 
    { 
     $newX = rand (($ts/2),$wh - ($ts/2)); 
     $newY = rand (($ts/2),$wh - ($ts/2)); 
     $randNo = array_pop($arrShuf); 
     $value = "" . $newX . "_" . $newY . "_" . $randNo; 
     $this->$key = $value; 

     //push coords onto an array for later ajax 
     $pushElem = "" . $newX . "_" . $newY; 
     $reply[] = $pushElem; 
    } 

    return $reply; 
} 

... und aktualisieren Sie Ihre globalen $replyArray mit die Antwort:

//make a solution object 
$aSolSet = new solSet; 
$replyArray = $aSolSet->jumble($widhi,$tileDim,$randArray); 

Sie brauchen nicht einmal den $reply Parameter in die Methode überhaupt dann passieren (beachten Sie, ein weniger Parameter) und alles ist alles schön und in sich abgeschlossen.

+0

Danke, das ist genau das, was ich tun werde. Ich habe die Antwort unten angekreuzt, weil das eine Antwort darauf war, warum mein Code nicht funktionierte, sondern neu geschrieben wurde. Ihre Antwort für mich macht jedoch am meisten Sinn. Ich war nur stur, das ist logischer. – KolKurtz

+0

Fair genug - ich habe ungefähr zur selben Zeit einen Kommentar zum selben Effekt wie Iaianns geschrieben. Ich habe auch seine Antwort aufgestockt, da sie exakt dem entspricht, wonach Sie gefragt haben ... obwohl ich persönlich diese Methode bevorzugen würde, um durch Verweis zu gehen;) – CD001

Verwandte Themen