PHP

생성자 (인스턴스 초기화)

수업소개

인스턴스를 생성할 때 해야 할 작업을 담아두는 약속된 메소드가 __construct 이고, 이 메소드를 생성자(constructor)라고 부릅니다.  이 수업에서는 생성자를 만드는 방법에 대해서 알아봅니다. 

수업

코드

<?php
class MyFileObject{
  function __construct($fname){
    $this->filename = $fname;
  }
  function isFile(){
    return is_file($this->filename);
  }
}
$file = new MyFileObject('data.txt');
// $file->filename = 'data.txt';
var_dump($file->isFile());
var_dump($file->filename);

참고

http://php.net/manual/en/language.oop5.decon.php

댓글

댓글 본문
작성자
비밀번호
  1. Q2: 'data.txt'를 $fname로 받는건 알겠는데,
    $this->filename = $fname; 이 코드의 의미는 뭔가요?
    'data.txt'를 $fname로 받았으니
    $this->filename = 'data.txt'; 랑 똑같은 의미라는건데
    이게 도대체 무슨 의미의 코드인가요 ㅠㅠ

    A: $fname 변수는 __construct함수에 종속된 변수라고 보시면 되고,
    $this->filename 변수는 해당 instance에 종속된 변수라고 보시면 됩니다.

    new MyFileObject('data.txt')를 호출할 때, instance를 만들고
    그 다음 __construct 메소드를 호출합니다. 이 때, __construct의
    매개변수인 $fname에 'data.txt'를 저장하는 것입니다. 이는 이전
    수업에서 계속 배웠던 함수와 동일합니다.
    여기서 $fname은 __construct 메소드에 종속되었기 때문에 이를
    $file Instance 안에 저장시켜주어야할 필요가 있는 것입니다.
    그래서 $this->filename = $fname을 통해 'data.txt'를 Instance내의
    Instance variable에 저장시켜 주는 것입니다.
    (과정)
    $fname = 'data.txt';
    $this->filename = $fname;
    >>> $this->filename = 'data.txt';
    대화보기
    • Q1: $this->filename = $fname; 을 좌항과 우항을 바꾼
      $fname = $this->filename; 로 하면 왜 안되는지 이유를 아시는분 계신가요?

      A: 저도 코딩을 처음 시작할 때는 굉장히 헷갈렸던 부분입니다. 이 부분을 이해하면
      프로그래밍적인 사고, 공학적인 사고가 굉장히 유연해질 것입니다. 먼저, PHP라는 것은
      프로그래밍 언어입니다. 언어란 사람과 사람 사이에 약속된 규칙같은 것입니다.
      사과라는 과일을 보고 이것을 '사과'라고 약속을 했기 때문에 우리가 이를 분별할 수
      있는 것입니다. 여기서 가장 중요한 것이 "약속"입니다.
      컴퓨터는 사실 약속의 집합체입니다. 0과 1의 연속이 이고잉님의 질좋은 수업으로
      이어질 수 있는 것도 약속 때문입니다.
      C언어를 만든 데니스 리치 선생님은 "(좌항)=(우항);"을 "(좌항)변수에 (우항)값을 저장한다."라고
      약속하였습니다. 사실 이 약속은 더 전에 다른 선생님께서 하셨을 수도 있습니다. 어쨌든
      중요한 점은 수학에서의 =와 프로그래밍에서의 =는 서로 약속 자체가 다르다는 것입니다.
      오히려 수학에서의 =는 프로그래밍에서의 ==와 비슷합니다. 프로그래밍에서의
      =는 교환법칙이 성립하지 않습니다. 그래서
      ($fname = $this->filename;) != ($this->filename = $fname;) 인 것입니다.
      그렇다면 매 언어마다 약속이 다르기 때문에 모든 언어의 약속을 알아야 하는 것이냐고
      질문을 하실수도 있는데, 프로그래밍에서 약속은 거의 비슷합니다. 마치 프랑스어를 알면
      스페인어를 공부하기 쉬운 것과 마찬가지 입니다. 프로그래밍 언어에서 대부분
      =는 (좌항)변수에 (우항)값을 저장한다는 뜻으로 이해하시면 얼추 맞으실 겁니다.
      대화보기
      • 웅이
        'data.txt'를 $fname로 받는건 알겠는데,
        $this->filename = $fname; 이 코드의 의미는 뭔가요?
        'data.txt'를 $fname로 받았으니
        $this->filename = 'data.txt'; 랑 똑같은 의미라는건데
        이게 도대체 무슨 의미의 코드인가요 ㅠㅠ
      • 웅이
        $this->filename = $fname; 을 좌항과 우항을 바꾼
        $fname = $this->filename; 로 하면 왜 안되는지 이유를 아시는분 계신가요?
      • ㅇㅇ
        되게 어이없네 언어가 진짜. 함수 바깥쪽에 변수 선언 안하고 그냥 내부에서 this로 생성되고 참조가 되네
      • 이해
        이 코드로 보면 더 이해가 빠른거같아요 ㅠㅠ
        파일을 자꾸 생성하는 코드는 이해가 어려웠는데 아래꺼 보고 바로 이해됬습니다.

        출처 : https://code.i-harness.com......4e6

        class Person {

        public $name = '';

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

        }

        $person = new Person( "Joe" );
        echo $person->name;
      • 언떼드
        안녕하세요..
        vscode 에디터를 사용중인데 __construct 는 인텔리센스기능이 안되는건가요-.-;;;
        php 인텔리센스 , php extension 확장팩 2개설치했는데
        __construct 는 안나와서 물어봅니다 구글링 실력이 부족해서 못찾고 글남겨봅니다.

        그리구 강의 잘보고있어요.. 많은도움이 됐습니다 ^^ 감사합니다.
      • 부에레스아이노스
        성공적인 웹 프로그래밍 php와 mysql "개정 5판 php7 coverage", 루크웰링, 로라톰슨 지음, 심재철 옮김.
        을 참조하면 객체지향 부분인 221page에 이렇게 나와있습니다.

        현재 클래스에 $attribute라는 속성이 있다면 이 속성을 $this->attribute로 참조하여 클래스 내부에서 사용할 수 있다.
        이것을 설정하는 방법은
        ----------------------------------------------------------------------------------------------------------------------------------------------------
        class classname
        {
        public $attribute;
        function operation($param)
        {
        $this->attribute =$param;
        echo $this->attribute;
        }
        }
        ----------------------------------------------------------------------------------------------------------------------------------------------------

        이 강의의 예를 들자면 이렇게 하는 거겠죠
        ----------------------------------------------------------------------------------------------------------------------------------------------------
        <?php
        class MyFileObject{
        public $filename; <-------------------이부분이 추가되어야 할 것 같네요
        function __construct($fname){
        $this->filename = $fname;
        }
        function isFile(){
        return is_file($this->filename);
        }
        }
        $file = new MyFileObject('data.txt');
        // $file->filename = 'data.txt';
        var_dump($file->isFile());
        var_dump($file->filename);
        ----------------------------------------------------------------------------------------------------------------------------------------------------

        꼭 저렇게 해야하는지는 모르겠지만 책의 내용으로 볼때 클래스 내부 속성값을 설정하고 사용한다 라고 되어있습니다.

        저도 질문보면서 강의를 계속 반복하여 들었고 그 부분의 설명이 조금 적길래 책과 함께 찾아보니 저런게 있었습니다. 좋은 질문에 저도 많은 도움받고 갑니다.
        대화보기
        • Hyung Jun Choi
          생성자가 좋은 이유는 인스턴스의 생성과 초기화를 동시에 할 수 있다는 것같습니다 ㅎㅎ
        • woejdl
          MyFileObject라는 클래스에 filename필드 자체가 없는데 MyFileObject 내부 메소드에서 filename을 사용하는 것이 어떻게 가능한건지 잘 이해가 안되네요ㅜㅜ
        • treehouse
          인스턴스,클래스,메소드 등.. 어려웠다
          하지만 여기까지다-
        • David Sun
          잘봤습니다.
        • dufuqsls
          잘봤습니다.,
        • Frank
          고맙습니다~
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기