0

私はオブジェクト指向プログラミングにまったく慣れていないので、私が持っているこの練習プロジェクトが間違っている理由を見つけることができません。それは私にfolliwngエラーメッセージを出し続けます:

警告:26行目のC:\ Users \ User \ Documents \ NetBeansProjects \ PhpProject3 \ poo_bdd \ connect_bdd.phpで呼び出され、C:\ Users \ User \ Documents \NetBeansProjectsで定義されているCharacter:: __construct()の引数2がありません13行目の\PhpProject3\ poo_bdd \ Character.classで、引数3〜6についても同じです。

クラスの定義

<?php
class Character 
    {
        //attributs de la classe
        private $_id;
        private $_name;
        private $_strength;
        private $_damage;
        private $_level;
        private $_experience;

        //on définit le constructeur
        public function __construct($id, $name,$strength,$damage,$level,$experience) 
        {
            $this->setId($id);
            $this->setName($name);
            $this->setStrength($strength);
            $this->setDamage($damage);
            $this->setLevel($level);
            $this->setExperience($experience);
        }

        //hydratation 
        public function hydrate(array $data)
        {
            foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                {
                    $this->$method($value);
                }
            }

            if(isset($data['id']))
            {
                $this->setId($data['id']);
            }
            if(isset($data['name']))
            {
                $this->setName($data['name']);
            }
            if(isset($data['strength']))
            {
                $this->setStrength($data['strength']);
            }
            if(isset($data['damage']))
            {
                $this->setDamage($data['damage']);
            }
            if(isset($data['level']))
            {
                $this->setLevel($data['level']);
            }
            if(isset($data['experience']))
            {
                $this->setExperience($data['experience']);
            }

        }

        //on définit les getters et setters
            //getters
        public function getId()
        {
            return $this->_id;
        }
        public function getName()
        {
            return $this->_name;
        }
        public function getStrength()
        {
            return $this->_strength;
        }
        public function getDamage()
        {
            return $this->_damage;
        }
        public function getLevel()
        {
            return $this->_level;
        }
        public function getExperience()
        {
            return $this->_experience;
        }

            // setters
        public function setId($id)
        {
              $this->_id = (int) $id;
        }

        public function setName($name)
        {
            if (is_string($name) && strlen($name) <= 30)
            {
                $this->_name = $name;
            }
        }

        public function setStrength($strength)
        {
            $this->_strength = $strength;
        }

        public function setDamage($damage)
        {
            $this->_damage = $damage;
        }

        public function setLevel($level)
        {
            $this->_level = $level;
        }

        public function setExperience($experience)
        {
            $this->_experience = $experience;
        }


     }

?>

そしてphpコード:

<?php

require ('Character.class');

try
    {

            //connexion à la table blog_messages 
            $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
            $bdd = new PDO('mysql:host=localhost;dbname=test; charset=UTF-8', 'root', '', $pdo_options);
            $bdd->query('SET NAMES utf8');

            //sélection des 3 derniers billets
            $request = $bdd->query('SELECT id, name, strength, damage, level, experience FROM personnages');

            //affichage des billets
            while ($data = $request->fetch(PDO::FETCH_ASSOC))
                {
                    $character = new Character($data);

                    echo $character->getName(),' has a strength of',$character->getStrength();
                }
            //on termine le traitement de la requète
            $request->closeCursor();
   }
        catch (Exception $e)
            {
                die('Erreur: '.$e->getMessage());
            } 

?>

SQL tbaleには、id、name、strength、damage、level、experienceの6つの列があります。

誰かが手がかりを持っているなら、それは素晴らしいことです。

ご協力いただきありがとうございます!

4

5 に答える 5

3

コンストラクターは6つの引数を受け入れますが、ここでは1つだけを渡します。

$character = new Character($data);

__constructコンストラクターが単一の連想配列を受け入れるようにする場合は、これをメソッドとして使用します。

    public function __construct($data) 
    {
        $this->setId($data["id"]);
        $this->setName($data["name"]);
        $this->setStrength($data["strength"]);
        $this->setDamage($data["damage"]);
        $this->setLevel($data["level"]);
        $this->setExperience($data["experience"]);
    }
于 2012-11-26T10:25:56.877 に答える
1

コンストラクターが6つのパラメーターを受け取ると警告が表示されますが、コンストラクターには1つしか与えません。

$character = new Character($data);

警告を表示したくない場合は、6つのパラメーターすべて(少なくとも''を使用)をコンストラクターに渡すか、必須でないパラメーターにデフォルト値を使用する必要があります。

于 2012-11-26T10:27:11.733 に答える
1

Characterクラスのコンストラクターは次のように定義されます。

__construct($id, $name,$strength,$damage,$level,$experience)

しかし、あなたはそれを次のように呼びます:

$character = new Character($data);

どちらがあなたの水分補給機能に似ていますか?

于 2012-11-26T10:27:25.163 に答える
0

これを試して:

$character = new Character($data['id'],$data['name'],$data['strength'],$data['damage'],$data['level'],$data['experience']);
于 2012-11-26T10:31:26.043 に答える
0

インスタンス化ループで、extract-functionを使用して、現在のスコープの変数にデータを抽出します。

//affichage des billets
while ($data = $request->fetch(PDO::FETCH_ASSOC))
{
   extract($data, EXTR_PREFIX_ALL, 'chr_');
   $character = new Character(
       $chr_id, $chr_name, $chr_str, 
       $chr_damage, $chr_level, $chr_experience
   );
   echo $character->getName(),' has a strength of',$character->getStrength();
}

extract-functionは少し魔法のようで変数を作成するので、 -variablesがどこから来ているのか$dataを理解するためにどのように見えるかを知る必要があることに注意してください。 より良い代替策は、ファクトリを作成し、抽出されるデータをカプセル化して視覚化することです。$chr_

abstract class CharacterFactory
{
  /**
   * Creates a new Character-object from the $data provided
   * @param array $data Character data as an array
   * @return Character A Character object with its properties set from $data
   */
  public static function create (array $data)
  {
    $id = $data['id'];
    $name = $data['name'];
    $str = $data['str'];
    $damage = $data['damage'];
    $level = $data['level']
    $experience = $data['experience'];
    return new Character($id, $name, $str, $damage, $level, $experience);
  }
}

// In your loop:
//affichage des billets
while ($data = $request->fetch(PDO::FETCH_ASSOC))
{
   $character = CharacterFactory::create($data);
   echo $character->getName(),' has a strength of',$character->getStrength();
}
于 2012-11-26T10:36:16.917 に答える