[ php ] Class 사용법 정리 4. 생성자 > php

본문 바로가기
사이트 내 전체검색

php

[ php ] Class 사용법 정리 4. 생성자

페이지 정보

작성자 웹지기 댓글 0건 조회 4,959회 작성일 18-09-11 14:35

본문

4.생성자  



생성자란?


생성자(constructor)는클래스의새로운인스턴스가생성될때자동적으로호출되는클래스내의함수이며,클래스명과동일한이름를갖는특수한메쏘드입니다.

classCart{

  var $items;  // Items in our shopping cart


// Add $num articles of $artnr to the cart


function add_item ($artnr, $num){

    $this->items[$artnr]+= $num;

  }


// Take $num articles of $artnr out of the cart


function remove_item ($artnr, $num){

    if($this->items[$artnr]> $num){

      $this->items[$artnr]-= $num;

      returntrue;

    }else{

      returnfalse;

    }  

  }

}


class Auto_Cart extendsCart{

  function Auto_Cart (){

    $this->add_item ("10",1);

  }

}


위의예제는클래스 Auto_Cart가new연산자로만들어질때마다품목번호""의수량이1을갖도록장바구니를초기화시키는생성자를새로이포함하여정의하였습니다.


생성자에전달되는인자


생성자는필요하면선택적으로인자(argument)를전달할수도있기때문에매우유용하게사용됩니다.


class Constructor_Cart extendsCart{

  function Constructor_Cart ($item ="10", $num =1){

    $this->add_item ($item, $num);

  }

}


// Shop the same old boring stuff.


$default_cart   =new Constructor_Cart;


// Shop for real...


$different_cart =new Constructor_Cart ("20",17);


PHP3와 PHP4 생성자사이에발생하는미묘한차이


PHP에서는클래스와동일한이름을가진함수를생성자로처리하고있습니다.

따라서아래와같은경우에클래스 B의이름과동일한이름의함수 B()가없으므로객체를생성할때실행할생성자가없습니다.

class A {

  function A(){

    echo "I am the constructor of A.\n";

  }

}


class B extends A {

  function C(){

    echo "I am a regular function.\n";

  }

}


// no constructor is being called in PHP.

$b =new B;



그러나만약아래와같이클래스 A에함수 B()가정의되어있다면설사클래스 B를가지고객체를생성하더라도클래스 A에있는일반함수 B()를클래스 B의생성자로인식합니다.

즉, PHP에서는함수 B()가클래스 B에속해있는지아니면부모클래스로부터상속된함수인지를인식하지못합니다.따라서객체 $b를생성할때클래스 A에있는일반함수 B()를생성자로써실행하게되는것이지요.

class A {

  function A(){

    echo "I am the constructor of A.\n";

  }


function B(){

    echo "I am a regular function named B in class A.

\n";

    echo "I am not a constructor in A.\n";

  }

}


class B extends A {

  function C(){

    echo "I am a regular function.\n";

  }

}


// no constructor is being called in PHP.

$b =new B;



클래스 B에속하지도않은,부모클래스로부터상속된일반함수 B()를클래스 B의생성자로인식한다는것은대부분우리가전혀의도하지않는일로잘못하다가는원치않는결과를초래할수도있습니다.

객체지향언어에서말하는생성자의구분이모호해진다는것이지요.이러한문제를 PHP4에서는바로잡았습니다.

단지이름만같다고생성자로처리하는것이아니라반드시해당클래스내에포함되어있는것만생성자로처리하도록수정하였습니다.

따라서위의예를 PHP4에서수행한다면클래스 A에속한일반함수 B()를생성자로써실행하지는않습니다.


대신에 PHP4에서는생성자와관련하여새로운기능이추가되었습니다.

파생클래스에서생성자가정의되어있지않으면그부모클래스에정의된생성자가실행하도록수정되었습니다.

즉,위의예에서보면객체 $b를생성할때클래스 B에해당하는생성자 B()함수가정의되어있지않으므로그부모클래스의생성자인 A()가생성자로수행됩니다.


이러한 PHP3와 PHP4 사이의미묘한차이를명확히구분하지못한상태에서생성자를다루게되면프로그램이매우심각한오류에빠질수있다는것을참고하시기바랍니다.


*****주의*****


PHP4에서의개선내용은http://www.php.net/manual/en/language. ··· ctor.php에서 문서화된 내용입니다만 

실제로 PHP4는 이 문서와 같이 동작하지 않는 것으로 보고되고 있습니다(아래 주소 참조할 것).


http://www.phpbuilder.com/lists/php-do ··· 00.php


이러한문제로인하여20년2월17일 bugs.php.net에공식적으로버그리포팅되어있습니다.


http://bugs.php.net/bug.php?id=22253


20년2월17일당시에는 PHP 버전4.3.1이공개된시점으로이이후버전에서도이버그는개선되지않고있습니다.

위에서언급한www.phpbuilder.com에의하면 PHP3와 php4가동일하게동작하며,단지 PHP5에서만개선된내용대로동작하고있음을알수있습니다.

 


추천0 비추천0

댓글목록

등록된 댓글이 없습니다.

Total 82건 6 페이지
  • 7 [ php ] 난수생성 rand, mt_rand
  • 함수rand() 난수생성mt_rand() 향상된 난수 생성srand() 난수생성 초기화getrandmax() 가능한 최대 난수값을 표시rand(최대값, 최소값) 또는 rand()mt_rand(최소값, 최대값) 또는 mt_rand()
  • 웹지기 09-06 5064 0 0 댓글 0
  • 5 [ php ] php에서 mysql 버젼 확인 하기
  • $sql = " SELECT version() AS mysql_version ";$row = sql_fetch($sql);echo $row['mysql_version'];$sql = " SHOW VARIABLES LIKE '%VERSION%' ";$result = sql_query($sql);while($row = sql_fetch_array($result)) { print_r2($row);}mysqli 에서는 오류를 내뱉는다.echo mysql_get_ser...
  • 웹지기 08-30 4016 0 0 댓글 0
  • 4 [ php ] [그누보드5] 사용자 게시글 작성시 관리자가 받는 메일에서 이미지 깨짐현상.
  • 사용자 게시글 작성시 관리자가 받는 메일에서 이미지 깨짐현상./bbs/write_update_mail.php<style>.gnu_content img{width:100%}</style>헤더부분에 스타일 추가$wr_content불러오는 부분의 div를<div class="gnu_content" 이런식으로 클래스를 추가해서 메일이 발송되게 해줌모바일에서 메일확인하면 테이블의 width가 정해져 있어서 깨진다�...
  • 웹지기 08-30 4813 0 0 댓글 0
  • 3 [ php ] MS Word docx 파일 생성 라이브러리
  • PHPWord : http://phpword.codeplex.com서버상에 docx 파일을 올리고 이파일에 특정 항목의 값을 post로 넘겨받은후 템플릿 파일에 그값을 채워넣고 워드파일 생성ex파일 : PHPWord/Examples/Template.php [이 게시물은 웹지기님에 의해 2018-08-28 14:20:25 php에서 이동 됨]
  • 웹지기 08-24 6130 0 0 댓글 0
+1
  • 2 [ php ] 마법상수 : magic constants __FILE__, __DIR 등등
  • 마법 상수 ¶PHP는 어떤스크립트에서도 유효한 많은 수의 미리 정의된 상수를 제공한다. 하지만 이 상수의 대부분은 다양한 확장(extension)에 의해 생성된다. 그래서 그 확장이 같이 컴파일되어 유효하거나 동적인 로딩이 되어있어야 이런 상수가 존재하게 된다.여덟 가지 마법 상수가 존재한다. 이 상수들은 어디에서 쓰느냐에 따라 용도가 변경된다. 예를 들면, __LINE__상수의 값은 스크립트의 해당 줄과 관련이 있다. 이 특별한 상수들은 대소문자 구별이 없고 다음과 같다:약간의 "마법&...
  • 웹지기 08-23 4979 0 0 댓글 0
  • 1 [ php ] json 한글 깨지는 현상 해결
  • 배열을 json_encode()해서 json으로 바꿀 때 한글 값이 유니코드로 깨져 들어가는 현상을 해결하는 방법PHP 버젼별로 다르게 구현PHP 5.3 이하function my_json_encode($arr){ //convmap since 0x80 char codes so it takes all multibyte codes (above ASCII 127). So such characters are being "hidden" from normal json_encoding ar...
  • 웹지기 08-28 8655 0 0 댓글 0
게시물 검색

회원로그인

접속자집계

오늘
9,121
어제
7,449
최대
33,828
전체
8,406,293

그누보드5
Copyright © funyphp.com. All rights reserved.