Luna-yours
@Luna-yours

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

引数の型が異なるようですがどう直したらいいかわかりません

タイトルなし.png

解決したいこと

引数の型が間違っているようでうまく動きません。
どのように直せばいいか教えてください。

プログラム初心者です。お手柔らかにお願いいたします。
ポケモンで学ぶphpというブログが存在したので、オブジェクト指向の練習として記述しているのですが、ブログの記載内容と同じように記述しているのですが、私の環境?ではうまくプログラムが動きません。
どう手直ししたらよいのでしょうか。
解決方法を教えて下さい。

発生している問題・エラー

画像参照




### 該当するソースコード
```言語名
ソースコードを入力
========
/**
    * アクション
    *
    * @param string $action
    * @param mixed $param
    * @return void
    */
    private function action($action, $param)
    {
        // 敵ポケモンの技をインスタンス化
        $e_move = $this->getInstance($this->aiSelectMove());
        switch ($action) {
            // にげる
            case 'run':
            if($this->checkRun()){
                unset($_SESSION['enemy']);
                unset($_SESSION['rank']);
                unset($_SESSION['run']);
                header("Location: ./home.php", true, 307) ;
                exit;
            }
            $this->setMessage('逃げられない!');
            $p_damage = $this->attack($this->enemy, $this->pokemon, $e_move);
            break;
            // たたかう
            case 'fight':
            // 自ポケモンの技をインスタンス化
            $p_move = $this->getInstance($param);
            // 行動順の判定
            if($this->checkFirstMove($p_move, $e_move)){
                // 先行
                // 自ポケモンの攻撃
                $e_damage = $this->attack($this->pokemon, $this->enemy, $p_move);
                // 敵ポケモンの攻撃
                $p_damage = $this->attack($this->enemy, $this->pokemon, $e_move);
            }else{
                // 後攻
                // 敵ポケモンの攻撃
                $p_damage = $this->attack($this->enemy, $this->pokemon, $e_move);
                // 自ポケモンの攻撃
                $e_damage = $this->attack($this->pokemon, $this->enemy, $p_move);
            }
            break;
        
            /*$this->attack($this->pokemon, $this->enemy, $param);
            $this->setResponse($this->pokemon->getRank(), $this->pokemon->getName());
            $this->setResponse($this->enemy->getRank(), $this->enemy->getName());
            break;*/
        }
        // 結果の返却
        $this->setResponse([
            '受けたダメージ' => $p_damage ?? 0,
            'ランク' => $this->pokemon->getRank(),
        ], $this->pokemon->getName());
        $this->setResponse([
            '受けたダメージ' => $e_damage ?? 0,
            'ランク' => $this->enemy->getRank(),
        ], $this->enemy->getName());
    }
============
/**
    * 先手の判定
    *
    * @param object 自ポケモンの技 $p_move
    * @param object 敵ポケモンの技 $e_move
    * @return boolean (pokemon > enemy):true (pokemon < enemy):false
    */
    private function checkFirstMove($p_move, $e_move)
    {
        /**
        * 優先度の比較
        */
        // 判定
        if($p_move->getPriority() > $e_move->getPriority()){
            // 優先度が高い
            return true;
        }elseif($p_move->getPriority() < $e_move->getPriority()){
            // 優先度が低い
            return false;
        }
        /**
        * すばやさの比較
        */
        // 自ポケモンの素早さ(補正あり実数値)
        $p_speed = $this->pokemon
        ->getStats('Speed', true);
        // 敵ポケモンの素早さ(補正あり実数値)
        $e_speed = $this->enemy
        ->getStats('Speed', true);
        // 判定
        if($p_speed > $e_speed){
            // 素早さが上回っている
            return true;
        }elseif($p_speed < $e_speed){
            // 素早さが下回っている
            return false;
        }elseif($p_speed === $e_speed){
            // 同速(50%の乱数)
            if(random_int(0, 1)){
                return true;
            }else{
                return false;
            }
        }
    }
============

trait InstanceTrait
{
    /**
    * インスタンス化関数
    * @param string $class_name
    * @return object
    */
    protected function getInstance($class_name)
    {
        // 存在チェックをして読み込み
        if(class_exists($class_name)){
            return new $class_name();
        }
    }

}
==========
0

1Answer

エラーの原因は文字列型を渡さなければならないところに(たぶん)クラスオブジェクトを渡されてるために起きていて、どこを直すべきかはエラーメッセージに全て書かれています。書かれているのですが、添付のソースコードはファイル名がないのと、(おそらく)抜粋されていて行数が解らなくなっているのでちょっとエラーメッセージとの対応を取れません。
ソースコード全部を公開すると大量で大変というのでしたら、エラーメッセージの読み方を質問してみるのも手かもしれないです。

どうやら'ThunderShock'という文字列を渡さなければならないところに、すでに生成されたThunderShockというクラスが渡されてるようなので、一旦生成したクラス変数を再度与えているか、繰り返し処理の中で初期化が忘れられているとかいったところではないかなあと想像しています。

2Like

Comments

  1. @Luna-yours

    Questioner

    ご回答ありがとうございます!!
    しばらく手がいっぱいでこちらに触れておらず、返信が遅くなってしまい失礼いたしました。
    ご回答いただいた内容拝見し、関連性のありそうな場所を片っ端から見ていったところ、たしかにクラス名を返すと指定しているところと、文字列を返そうとしているところがありました!!
    片方削除したら無事に動きました。
    初めてQiitaを利用してつたない質問だったにもかかわらず、ご回答いただき大変に感謝の気持ちでいっぱいです!!ありがとうございました!!

Your answer might help someone💌