2013-02-19 3 views
0

php n00b здесь:Как вернуть переменную и массив из метода в php?

Я пытаюсь выбрать карту из колоды.

Экземпляр класса «$ test_1», а функция pick_card - это метод этого класса.

Я хочу, чтобы функция возвращала 1) карту, которую я хочу, и 2) колоду, менее одной карты.

Куда я иду не так?

$card, $deck = $test_1->pick_card($play_deck); 

public function pick_card(&$deck) 
{ 
    $card = $deck[0]; 
    echo "picked this card: " . $card . "<br />"; 
    array_splice($deck,0,0); 
    return $card; $deck; 
} 
+2

необходимость return array? 'return array ($ card, $ deck);' и вывести его с помощью 'list ($ card, $ deck) = func();' – Federkun

ответ

3

Вы не можете вернуть две переменные, как, что в PHP. Я отмечаю, что вы передаете $deck функции по ссылке, поэтому любые изменения, которые вы вносите в эту переменную, будут отражаться в этой переменной, поскольку функция работает на ней.

Это, как говорится, поскольку это класс, вам действительно не нужно передавать переменную вообще, вы действительно должны иметь свойство, которое хранит вашу колоду. Я бы предложил что-то вроде этого:

class card_deck { 
    protected $deck = NULL; 

    public function __construct() { 
     // some logic to create, shuffle, and set deck array to $this->deck 
    } 

    public function pick_card() { 
     if($this->get_card_count() < 1) { 
      throw new Exception('The deck is empty.'); 
     } 
     return array_shift($this->deck); 
    } 

    public function get_card_count() { 
     return count($this->deck); 
    } 
} 
+0

Спасибо! Как мне получить доступ к $ deck после создания экземпляра класса? – dwstein

+0

@dwstein Лично я бы предложил добавить метод 'get_deck()', который вернул бы '$ this-> колоду', однако вы также можете просто открыть' $ this-> deck' и получить доступ к свойству напрямую. Я лично предпочитаю ограничивать доступ к свойствам вне класса, чтобы быть через getters/seters. Я упростил изменение логики get/set в строке, если у вас нет кучи мест в коде, которые напрямую обращаются к этому свойству. –

+0

большое спасибо! – dwstein

0

Вы можете вернуть нужные значения в ассоциативном массиве. Я думаю, что вы знакомы с массивами, как вы используете deck[0] в вашей pick_card функции:

class Foo{ 
    public function pick_card(&$deck){ 
     $card = $deck[0]; 
     echo "picked this card: " . $card . "<br />"; 
     array_splice($deck,0,0); 
     return array('card'=>$card,'deck'=>$deck); 
    } 
} 
$test_1 = new Foo; 
$deck = $test_1->pick_card($play_deck); 
echo 'Card: '.$deck['card'].'<br>'; 
echo 'Deck: '.$deck['deck']; 
2

Вам нужно будет вернуть его в виде массива. Вы можете использовать ассоциативный массив, или вы можете использовать list разбить массив обратно в переменных, как это:

list($card, $deck) = $test_1->pick_card($play_deck); 

public function pick_card(&$deck) 
{ 
    $card = $deck[0]; 
    echo "picked this card: " . $card . "<br />"; 
    array_splice($deck,0,0); 
    return array($card, $deck); 
} 
1

, поскольку у вас есть объект, который вы также можете использовать $this

class card_deck { 
    public $card; 
    public $deck; 
    public function pick_card(&$deck) { 
    $this->card = $deck[0]; 
    $this->deck = $deck; 
    echo "picked this card: " . $this->card . "<br />"; 
    array_splice($this->deck,0,0); 
    } 
} 

$test_1 = new card_deck(); 
//set $play_deck 
$test_1->pick_card($play_deck); 

// now use 
$test_1->card; 
$test_1->deck;