2017-06-11 6 views
1

私はphpとmysqlを使って作業しますが、時々私はPHPオブジェクトを返すオブジェクト、ロードリストなどのために私のPHPクラスをインスタンス化する必要がありますが、時にはクラスコンストラクタを使用します。phpクラスでコンストラクタdobleを作成できますか?

私はクラス内にドブルコンストラクタを作成できますか?

例:私のアクセスレイヤで

class Student { 

private $id; 
private $name; 
private $course; 

function __construct() { 

} 

//get set id and name 

function setCourse($course) { 
    $this->course = $course; 
} 


function getCourse() { 
    $this->course = $course; 
} 

} 

class Course { 

private $id; 
private $description; 

function __construct($id) { 
    this->id = $id; 
} 

//get set, id, description 

} 

いつか私は例えば、異なる方法 でコンストラクタを使用します。

 $result = $stmt->fetchAll(); 
     $listStudent = new ArrayObject(); 

     if($result != null) { 

      foreach($result as $row) { 

       $student = new Student(); 

       $student->setId($row['id']); 
       $student->setName($row['name']); 
       $student->setCourse(new Course($row['idcourse'])); //this works 

       $listStudent ->append($sol); 
      } 
      } 

をしかし、時には、私は例えば、別の方法でコンストラクタを使用する必要があります

$result = $stmt->fetchAll(); 
     $listCourses = new ArrayObject(); 

     if($result != null) { 

      foreach($result as $row) { 

       $course = new Course(); //but here not work, becouse Class course receives a id 

       $course->setId($row['idcourse']); 
       $course->setDescription($row['description']); 

       $listCourses->append($sol); 
      } 
     } 

英語が非常に悪い、 私はあなたが私に

+0

あなたの英語は良いですが、何を達成したいのか分かりません。 2つ(またはそれ以上)のコンストラクタを持つクラスを作成しますか? – axiac

+0

コンストラクタの目的は、オブジェクトのプロパティを初期化して使用できるようにすることです。 'Student 'クラスで発生するような空のコンストラクタ(+ setter)は、OOPとして偽装された手続き型プログラミングの兆候です。 'Student'プロパティの初期化をコンストラクタに入れ、setterを削除します。 – axiac

+0

こんにちは、私は達成するためには、コンストラクタとコンストラクタなしで、原因エラーなしでオブジェクトを作成することです: $コース=新しいコース(); - >作品 と $コース=新しいコース($ id); - >も動作します 私は仕事がありません: $ course = new Course(); - >動作しません と $コース=新しいコース($ id); - >作品 あなたの時間に感謝 –

答えて

0

使用default argumentsを理解してほしい:

class Course { 

    private $id; 
    private $description; 

    function __construct($id = 0) { 
    this->id = $id; 
    } 

    // getters and setters for id and description 

} 

、あなたがそのようにそれを使用することができます:

$course = new Course(12); // works with argument 

や:などの

$course = new Course(); // works without argument 
$course->setId(12); 
+0

しかし、私の考えは、いくつかの関数のコードを減らすことです。例: https://paste2.org/kbt56aBW –

+0

場合によっては、コンストラクタをまったく呼びたくないのですか? – PeterMader

0
class Course { 

    private $id; 
    private $description; 

    public function __construct() { 
      // allocate your stuff 
     } 

    public static function constructWithID($id) { 
      $instance = new self(); 
      //do your stuffs here 
      return $instance; 
     } 

コールCourse :: constructWithID(.. id)wheあなたはidを渡す必要があります。それ以外の場合はオブジェクトを作成します(new Course())。

+0

amm私は理解しています...良い練習ですか? –

+0

静的メソッド 'constructWitID()'は、「名前付きコンストラクタ」とも呼ばれます。それは悪い(または良い)習慣ではありません。新しいオブジェクトを作成するためにそれを使用する方法(および通常のコンストラクタ)は、良い方法と悪い方法として分類できます。 – axiac

関連する問題