Nesneleri bir dizi üzerinde PHP foreach

3 Cevap php

Ben nesneleri bir dizi için bir foreach döngü kullanmak çalışıyorum. BeginBattle () yönteminin içinde ben tüm nesneleri yineleme ve otomatik olarak oynadı sayısını artırmak istiyoruz. Fatal error: Call to a member function BattleInitiated() on a non-object in /nfs/c05/h01/mnt/70299/domains/munchkinparty.neededspace.net/html/Battle.php on line 75: Ne yazık ki, web tarayıcısı bir hata olduğunu gösterir

Herhangi bir fikir?

<?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/>";
        }
    }

}
?>

Her şey beyan denir ve bu nerede:

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

Oyuncu Sınıfı

    <?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 Cevap

Hata iletisi, bir nesne değil bir şey üzerinde tüm BattleInitiated() yöntemine çalıştığınız gösterir.

Kodundan bakılırsa, sorun BeginBattle() yönteminde, bu döngü ile gibi görünüyor:

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

Sizin dizideki en az bir $ çalar, demek ki, muhtemelen bir nesne değildir; belki null, ya da bir dizi?


To know more, you should use var_dump to display the content of $this->_players before the loop, just to make sure it contains what you expect it to :

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

$this->_players için beklediğiniz ne içermiyorsa (and it probably doesn't !), daha sonra neden bulmak gerekecek ...


Considering $this->_players is modified by the AddPlayer() method, which adds what it receives to the end of the array, I would bet that AddPlayer() is called at least once without a correct $player as a parameter.

Bu konuda yardımcı için, var_dump $player eklenmeden üzerinde kullanabilirsiniz:

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

O var_dump o $player bir nesne (for instance, it's null, ya da bir dizi, ya da bir dize değil en az bir kez gösteriyorsa, ...) , sizin Ölümcül Hata nedeni bulunuyor.

Eğer bunu görmüyorum?

çünkü küçük bir yazım hatası hepsi:

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

declared: $_P_layerC used: $_p_layerC

Bu doğru ve gitmek için iyi bir konum

Sizin $player değişken olabilen null ya da değil, bir Object type siz olmak istiyorum arasında.

PlayerObject oyuncu için sınıf adı olduğunu hiç budur.

Örneğin

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

Aradığınızda BeginBattle() $player1->BattleInitiated(); başarılı olacak ama $player2->BattleInitiated() size ölümcül hata verir ve çalışmasını kodunuzu durur. Aynı $player2 bir tamsayı ya da bir şey, boş olsaydı PlayerObject.