[문법] php5에서 클래스에서의 참조형변수 :: PHP5의 추가된 사항을 올리는 곳입니다.[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

PHP5의 추가된 사항을 올리는 곳입니다.
[1]
등록일:2007-10-10 22:53:15 (0%)
작성자:
제목:[문법] php5에서 클래스에서의 참조형변수
아래  칼솜님의  글을  보고  댓글로  적다가  좀  내용이  길어져서  여기다  적으려고  합니다.  

php4에서는  잘  모르겠지만,  php5에서  작업을  요즘  하다보니까,  
그  모양이  상당히  자바와  비슷하다고  생각되어졌습니다.  

그래서  약간  정리해  보았습니다.  

일단  new  키워드로  무언가를  생성하면  C에서는  포인터가  java에서는  참조형  변수가  리턴됩니다.  아니나  다를까,  php에서도  참조형  변수로  돌려지더군요.  

포인터라는  개념이  없으니,  void형  포인터라고  생각해도  되고  java의  참조형변수라고  생각해도  될  듯합니다.  

===========================  

class  CA  {  
        public  $var  =  0;  
        public  function  display()  {  
                echo  "부모클래스<br>";  
        }  
}  

class  CB  extends  CA  {  
        public  $var  =  1;  
        public  function  display()  {  
                echo  "자식B  클래스<br>";  
        }  
}  
class  CC  extends  CA  {  
        public  $var  =  2;  
        public  function  display()  {  
                echo  "자식C  클래스<br>";  
        }  
}  

$inst  =  array();  

array_push($inst,  new  CA());  
array_push($inst,  new  CB());  
array_push($inst,  new  CC());  

$inst[0]->display();  
$inst[1]->display();  
$inst[2]->display();  

=================================  
php에서는  자료형을  따로  적지  않기  때문에  $inst는  어떠한  클래스의  참조형변수든  다  가질수  있기  때문에  위와  같은  다형성을  추구할  수  있습니다.  
inst에  무슨값을  가지고  있던지,  각자의  display()함수가  작동합니다.  


결과는  

부모클래스  
자식B  클래스  
자식C  클래스  


이렇게  됩니다.  


그리고  함수사용시에  참조형  변수를  인자값으로  넘기면,  어떻게  되느냐,,  하는  문제가  있는데,  
php에서는  C++처럼  

ClassName  $inst;  
이런식으로  객체를  만들수  없습니다.  그래서  무조건  자바처럼  
$inst  =  new  ClassName();  이렇게만  만들수  있죠.  
자바의  경우는  $inst는  콜바이  레퍼런스의  형태로  넘기게  됩니다.  


===========================  
//위의  코드에  이어서  
//call  by  value인지  call  by  reference인지  실험  
function  func(CA  $instance,  $i)  {  
        $instance->var  =  $i;  
}  

func($inst[0],  100);  
echo  $inst[0]->var;  

func($inst[1],  200);  
echo  $inst[1]->var;  

===========================  

php5에서는  함수의  인자에  형식힌트를  적을  수  있습니다.  
저  함수에서  받게  되는  아규먼트는  CA라는  클래스의  객체(의  참조형변수)라는거죠.  

결과는  어떻게  될까요?  
만약  콜바이  밸류로  넘기는  거라면  아마  저  클래스의  $var값은  변하지  않아야  하지만  
사실  콜바이  리퍼런스로  넘기게  됩니다.  그것은  클래스의  객체는  참조형변수이기  때문입니다.  

결과는  
100  
200  
이  됩니다  


&  기호를  사용하지  않아도  php에서는  적절히  자바처럼  참조형  변수를  만들어  내는  것이었습니다.->call  by  reference를  사용한다는  말이죠.  

그런데  재미잇는것은  저  함수는  CA형  객체(의  참조형변수)가  넘어오도록  햇는데  

inst[1]에  든  값은  CA를  상속한  CB클래스의  객체거든요..  
그럼에도  불구하고,  inst[1]의  $var값이  바뀌게  됩니다.  

그런데  function  func(CA  $instance,  $i)  
이걸  function  func(CB  $instance,  $i)  
이렇게  바꾸면,  에러가  납니다.  

부모의  이름으로  자식의  객체를  불러쓸수는  있어도,  
자식의  이름으로  부모의  객체를  불러  올수  없기  때문이죠.  

마음편하게  function  func($instance,  $i)    이렇게  하면  되는거  아니냐,  할테지만,  
저런  자료형을  적는게  다  일부러  제한을  시키는  거라서요,  엉뚱한  객체를  넘기지  않게  하는거죠.  



아무튼,  좀  이상한  방향으로  흘렀는데,  

new로  객체를  만들면  자바처럼  참조형  변수가  만들어지고,  
함수에서  사용할때  &이런거  사용안해도  참조형  변수는  콜바이리퍼런스를  사용한다는  내용이었습니다.  

그럼  좋은  하루  되세요  



(라이센스는  대체  뭐가  뭔지  알수가  없네요..  그래서  제일처음것  골랐습니다.;;;)  


출처  :  http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=50541&sca=&sfl=wr_subject%7C%7Cwr_content&stx=php5&sop=and&page=2
[본문링크] [문법] php5에서 클래스에서의 참조형변수
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=1080
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.