2016-07-21 2 views
0

PHP не является моей сильной стороной, но сегодня я пробовал некоторый код OO. Все отлично, за исключением того, что массив $ answerArray на глобальном уровне не получается написанным методом класса jumble() моего объекта solSet. Предпоследний var_dump в моем коде показывает пустой массив. Я пробовал метать глобальные ключевые слова, и это не помогло. Поскольку я явно передаю эту переменную по ссылке на мой новый экземпляр класса, разве этого недостаточно? Спасибо! ккНевозможно записать значения в глобальный массив PHP из метода класса

<?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); 

?> 

Это, кажется, относятся: Using a global array inside a class Но это то, что я сделал. Также весь мир и его собака говорят, что глобальное ключевое слово «делает это неправильно». Что делать?

+0

Вы не на самом деле * "явно передаете эту переменную по ссылке" * - это будет 'public function jumble ($ wh, $ ts, $ arrShuf, & $ reply)' – CD001

ответ

3

Ваш метод jumble должен принять $replyArray по ссылке - по умолчанию PHP функции работают по значению, что означает, что они действуют на копии переменной, а чем его модификация. См http://php.net/manual/en/language.references.pass.php

Изменить

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

в

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

Амперсанд перед именем переменной означает, что параметр передается по ссылке.

+0

Отправлено, потому что это была именно проблема. Я предпочел ссылку. Благодаря! – KolKurtz

0

ссылка глобальный массив в функции

global $replyArray; 
+0

Спасибо за ваш ответ. Мне сказали, что это непослушный! – KolKurtz

1

В качестве альтернативы, вместо обновления глобальной переменной внутри класса (плохо для повторного использования и портативность) вы можете просто вернуть новый перетасовал массив:

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; 
} 

... и обновить глобальный $replyArray с ответ:

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

Вам даже не нужно передать параметр $reply в ваш метод на всех, то (заметьте, один меньше параметров), и все это все красиво и самодостаточным.

+0

Спасибо, это именно то, что я буду делать. Я пометил ответ ниже, потому что это был ответ на вопрос, почему мой код не работал, а не переписывался. Однако ваш ответ для меня имеет смысл. Я просто упрям, это более логично. – KolKurtz

+0

Достаточно честно - я добавил комментарий к тому же эффекту, что и iaiann примерно в то же время. Я также поддержал его ответ, поскольку он точно соответствовал тому, что вы просили ... хотя, лично, я бы предпочел, чтобы этот метод передавался по ссылке;) – CD001

Смежные вопросы