|
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 |
|
|
|
|
|
|
|
|
|
Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.
|
|
|