PHP foreach для массива объектов - PullRequest
2 голосов
/ 05 марта 2010

Я пытаюсь использовать цикл foreach для массива объектов. Внутри метода BeginBattle () я хочу перебрать все объекты и автоматически увеличить их количество. К сожалению, веб-браузер показывает, что у меня ошибка: Неустранимая ошибка: вызов функции-члена BattleInitiated () для необъекта в /nfs/c05/h01/mnt/70299/domains/munchkinparty.neededspace.net/ html / Battle.php в строке 75

Есть идеи?

<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Battle
 *
 * @author joshualowry
 */
class Battle {
    /**
     *
     * @var <type>
     */
    private $_players;
    /**
     *
     * @var <type>
     */
    private $_battleInProgress;
    /**
     *
     */
    public function Battle(){
        $this->_players = array();
        $this->_battleInProgress = FALSE;

    }
    /**
     *
     * @param <type> $player
     * @return <type>
     */
    public function AddPlayer($player){
        if(!$this->_battleInProgress)
            $this->_players[] = $player;
        else
            return;
            //Spit some error
    }

    /**
     *
     * @param <type> $player
     * @return <type>
     */
    public function BattleWon($player){
        if($player != NULL)
            $player->BattleWon();
        else
            return;
            //Spit some error
    }
    /** GetPlayerByName Get the player's object by the player's name field.
     *
     * @param <type> $playerName
     * @return <type>
     */
    public function GetPlayerByName($playerName){
        foreach($this->_players as &$player) {
            if($player->GetName() == $playerName)
        return $player;
        }
        return NULL;
    }

    /**
     *
     */
    public function BeginBattle(){
        $this->_battleInProgress = TRUE;
        foreach($this->_players as $player){
        $player->BattleInitiated();
    }
    }
    /**
     *
     */
    public function DisplayCurrentBoard() {
        echo "Name  Alias   Wins    Battles<br/>";
        foreach($this->_players as &$player){
            echo "$player->GetName()    $player->GetAlias() $player->GetWins()  $player->GetBattles()<br/>";
        }
    }

}
?>

Здесь все объявляется и называется:

<?php
    include 'Battle.php';
    include 'Person.php';
    include 'Player.php';

    $currentBattle = new Battle();

    $playerA = new Player("JohnnyDanger","John",0,0);
    $playerB = new Player("JoshTheJest","Josh",0,0);
    $PlayerC = new Player("CarbQueen","Nicole",0,0);

    $currentBattle->AddPlayer($playerA);
    $currentBattle->AddPlayer($playerB);
    $currentBattle->AddPlayer($playerC);

    $currentBattle->BeginBattle();
    $currentBattle->BattleWon($currentBattle->GetPlayerByName("Josh"));
    $currentBattle->DisplayCurrentBoard();
?>

Класс игрока

    <?php

    /**
    * Description of Player
    *
    * @author joshualowry
    */
    class Player extends Person {

        private $_alias;
        private $_wins;
        private $_battles;

        public function Player($name, $alias, $wins, $battles) {
            parent::SetName($name);
            $this->_alias = $alias;
            $this->_battles = $battles;

            if($battles == 0) {
                $this->_wins = 0;
            }
            else {
                $this->_wins = $wins;
            }
        }

        protected function SetAlias($value){
            $this->_alias = $value;
        }

        public function GetAlias(){
            return $this->_alias;
        }

        protected function SetBattles($value) {
            $this->_battles = $value;
        }

        public function GetBattles(){
            return $this->_battles;
        }

        protected function SetWins($value) {
            $this->_wins = $value;
        }

        public function GetWins() {
            return $this->_wins;
        }

        public function BattleWon(){
            $this->_wins += 1;
        }

        public function BattleInitiated(){
            $this->_battles += 1;
        }

    }

?>

Ответы [ 3 ]

3 голосов
/ 05 марта 2010

Сообщение об ошибке указывает, что вы пытаетесь использовать метод BattleInitiated() для чего-то, что не было объектом.

Судя по вашему коду, проблема в этом цикле, в методе BeginBattle():

foreach($this->_players as $player){
    $player->BattleInitiated();
}

Что означает, что $ player, по крайней мере, один в вашем массиве, вероятно, не является объектом; может это null или массив?


Чтобы узнать больше, вы должны использовать var_dump для отображения содержимого $this->_players перед циклом, просто чтобы убедиться, что оно содержит то, что вы ожидаете:

public function BeginBattle(){
    var_dump($this->_players);
    $this->_battleInProgress = TRUE;
    foreach($this->_players as $player){
        $player->BattleInitiated();
    }
}

Если $this->_players не содержит того, что вы ожидаете, (а это, вероятно, нет!) , вам придется выяснить, почему ...


Учитывая, что $this->_players модифицируется методом AddPlayer(), который добавляет то, что он получает, к концу массива, могу поспорить, что AddPlayer() вызывается хотя бы один раз без правильного $player в качестве параметра.

Чтобы помочь с этим, вы можете использовать var_dump на добавляемом $player:

public function AddPlayer($player){
    var_dump($player);
    if(!$this->_battleInProgress)
        $this->_players[] = $player;
    else
        return;
        //Spit some error
}

Если это var_dump указывает хотя бы один раз, что $player не является объектом (например, это null, или массив, или строка, ...) , это причина вашей фатальной ошибки.

1 голос
/ 05 февраля 2013

разве ты не видишь это?

это все из-за маленькой опечатки:

 $playerA = new Player("JohnnyDanger","John",0,0);
    $playerB = new Player("JoshTheJest","Josh",0,0);
    $PlayerC = new Player("CarbQueen","Nicole",0,0);

    $currentBattle->AddPlayer($playerA);
    $currentBattle->AddPlayer($playerB);
    $currentBattle->AddPlayer($playerC);

объявлено: $ _P_layerC используется: $ _p_layerC

исправьте это, и вы готовы идти

0 голосов
/ 05 марта 2010

Ваша $player переменная либо пусто , либо не Объект типа , который вы хотите.

PlayerObject это то, что всегда является вашим именем класса для игрока.

Например,

$battle=new Battle();
$player1=new PlayerObject();
$player2="player";
$battle->AddPlayer($player1);
$battle->AddPlayer($player2);
$battle->BeginBattle();

, когда вы звоните BeginBattle(), $player1->BattleInitiated(); будет успешным, но $player2->BattleInitiated() даст вамфатальная ошибка и остановка работы вашего кода.то же самое, если $player2 было нулевым, целым или чем-то, что не PlayerObject.

...