Zend 엔진 의 발전[15]

이 장의 마지막 부분 에서 Zeev 는 Zend 엔진 이 가 져 온 대상 모델 에 대해 논 의 했 습 니 다.특히 PHP 의 이전 버 전의 모델 과 무엇이 다른 지 언급 했 습 니 다.1997 년 여름 에 우 리 는 PHP 3 를 개 발 했 을 때 우 리 는 PHP 가 대상 을 대상 으로 하 는 능력 을 갖 추 게 할 계획 이 없 었 습 니 다.그 당시 에는 유형 과 대상 과 관련 된 생각 이 없 었 습 니 다.PHP 3 는 순수 하 게 과정 을 대상 으로 하 는 언어 였 습 니 다.그러나,1997.8.27 의 밤 에 PHP 3 alpha 버 전에 서 클래스 에 대한 지원 을 추 가 했 습 니 다.새로운 특성 을 추가 하여 PHP 에 주 었 습 니 다.그 당시 에는 아주 적은 토론 만 필요 로 했 습 니 다.그 당시 PHP 를 탐색 하 는 사람 이 너무 적 었 기 때문에 1997 년 8 월 부터 PHP 는 대상 을 대상 으로 프로 그래 밍 언어 를 향 한 첫 걸음 을 내 디 뎠 습 니 다.확실히 이것 은 첫 걸음 이 었 습 니 다.이 디자인 에 서 는 관련 된 생각 이 극히 적 었 기 때 문 입 니 다.대상 에 대한 지원 이 강하 지 않 습 니 다.이 버 전에 서 사용 대상 은 배열 에 접근 하 는 멋 진 방법 일 뿐 입 니 다.$foo["bar"]대신 사용 합 니 다.더 예 뻐 보 이 는$foo->bar 를 사용 할 수 있 습 니 다.대상 을 대상 으로 하 는 방법의 주요 장점 은 구성원 함수 나 방법 으로 기능 을 저장 하 는 것 입 니 다.예 6.18 에 전형 적 인 코드 블록 이 표시 되 어 있 습 니 다.그러나 예 6.19 의 방법 과 크게 다 르 지 않 습 니 다.Listing 6.18 PHP 3 object-oriented programming PHP 3 의 대상 을 대상 으로 프로 그래 밍 합 니 다.
value; } } $obj = new Example(); $obj->PrintValue(); ?> Listing 6.19 PHP 3 structural programming PHP 3 PHP 3 의 구조 화 프로 그래 밍
이상 클래스 에 두 줄 의 코드 를 쓰 거나 함수 에 배열 을 표시 적 으로 전달 합 니 다.그러나 PHP 3 에서 이 두 가지 선택 이 다 르 지 않 음 을 감안 하여 우 리 는 대상 모델 을'문법 적 인 장식'으로 만 배열 을 방문 할 수 있 습 니 다.이미지 개발 자,특히 디자인 모델 을 사용 하고 싶 은 사람 은 PHP 로 대상 을 대상 으로 합 니 다.곧 그들 이 벽 에 부 딪 혔 다 는 것 을 알 게 되 었 습 니 다.다행히도,당시(PHP 3 시대)에는 대상 을 대상 으로 개발 하려 는 사람 이 많 지 않 았 습 니 다.PHP 4 는 이러한 상황 을 바 꾸 었 습 니 다.새로운 버 전 은 참조(reference)개념 을 가 져 왔 습 니 다.PHP 의 서로 다른 식별 자 는 메모리 의 같은 주 소 를 가리 킬 수 있 습 니 다.이것 은 두 개 이상 의 이름 을 사용 하여 같은 변수 에 이름 을 붙 일 수 있다 는 것 을 의미 합 니 다.예 6.20 처럼 Listing 6.20 PHP 4 references PHP 4 에서 의 인용
서 로 를 가리 키 는 대상 네트워크 를 구축 하 는 것 은 모든 대상 을 대상 으로 하 는 디자인 모델 의 기초 이기 때문에 이 개선 은 매우 중요 한 의 미 를 가진다.인용 이 더 강력 한 대상 을 대상 으로 하 는 응용 프로그램 을 만 들 수 있 도록 허용 하면 PHP 가 대상 과 다른 유형의 데 이 터 를 똑 같이 대 하 는 방법 은 개발 자 에 게 큰 고통 을 줄 것 이다.모든 PHP 4 프로그래머 가 알려 줄 것 처럼,응용 프로그램 은 WTMA(Way Too Many Ampersands 과 다&)증후군 에 부 딪 힐 것 이다.실제 응용 프로그램 을 구축 하려 면 매우 고 통 스 러 울 것 이다.예 를 들 어 6.21 을 보면 알 수 있다.Listing 6.21 Problems with objects in PHP 4 PHP 4 에서 사용 하 는 대상 의 문제
1 class MyFoo { 2 function MyFoo() 3 { 4 $this->me = &$this; 5 $this->value = 5; 6 } 7 8 function setValue($val) 9 { 10 $this->value = $val; 11 } 12 13 function getValue() 14 { 15 return $this->value; 16 } 17 18 function getValueFromMe() 19 { 20 return $this->me->value; 21 } 22 } 23 24 function CreateObject($class_type) 25 { 26 switch ($class_type) { 27 case "foo": 28 $obj = new MyFoo(); 29 break; 30 case "bar": 31 $obj = new MyBar(); 32 break; 33 } 34 return $obj; 35 } 36 37 $global_obj = CreateObject ("foo"); 38 $global_obj->setValue(7); 39 40 print "Value is " . $global_obj->getValue() . "n"; 41 print "Value is " . $global_obj->getValueFromMe() . "n";
한 걸음 한 걸음 토론 합 시다.우선,MyFoo 류 가 있 습 니 다.구조 함수 에서 우 리 는$this->me 에 게 인용 을 주 고 다른 세 멤버 함수 가 있 습 니 다.하 나 는 this->value 의 값 을 설정 합 니 다.this->value 의 값 을 되 돌려 줍 니 다.다른 하 나 는 this->value->me 의 값 을 되 돌려 줍 니 다.하지만--$this 는 같은 것 이 아 닙 니까?MyFoo::getValue()와 MyFoo::getValue FromMe()가 돌아 오 는 값 은 같 지 않 습 니까?우선,우 리 는 Create Object("foo")를 호출 합 니 다.이것 은 MyFoo 형식의 대상 을 되 돌려 줍 니 다.그리고 우 리 는 MyFoo::setValue(7)를 호출 합 니 다.마지막 으로,우 리 는 MyFoo::getValue()와 MyFoo::getValue FromMe()를 호출 합 니 다.반환 치 7 을 기대 합 니 다.물론,우리 가 어떤 상황 에서 도 7 을 얻 으 면,이상 의 이 예 는 이 책 에서 가장 무의미 한 예 가 아 닐 것 이다.그래서 나 는 네가 이미 알 아 맞 혔 다 고 믿는다.우 리 는 7 이라는 결 과 를 얻 지 못 할 것 이다.그러나 우 리 는 어떤 결 과 를 얻 을 것 이 고 더 중요 한 것 은 무엇 일 까?왜 일 까?우리 가 얻 을 결 과 는 각각 7 과 5 입 니 다.왜―--세 가지 좋 은 이유 가 있 습 니 다.우선 구조 함 수 를 보 세 요.구조 함수 내부 에서 우 리 는 this 와 this->me 사이 에 인용 을 만 듭 니 다.다시 말 하면 this 와 this->me 는 같은 것 입 니 다.그러나 우 리 는 구조 함수 내 에 있 습 니 다.구조 함수 가 끝나 면 PHP 는 대상(new MyFoo 의 결과,28 번 째 줄)$obj 에 할당 합 니 다.대상 은 특별한 취급 을 받 지 않 았 기 때 문 입 니 다.다른 데이터 형식 과 마찬가지 로 할당 X 는 Y 가 X 의 사본 임 을 의미 합 니 다.즉,obj 는 new MyFoo 의 사본 이 고 new MyFoo 는 구조 함수 에 존재 하 는 대상 입 니 다.Obj->me 는 어 떻 습 니까?인용 이기 때문에 그대로 원래 의 대상 인 this 를 가리 키 고 있 습 니 다.Voila-obj 와 obj->me 는 더 이상 같은 것 이 아 닙 니 다.그 중 하 나 는 변 하지 않 습 니 다.이상 은 첫 번 째 이유 입 니 다.그리고 첫 번 째 와 유사 한 다른 이유 도 있 습 니 다.기적 적 으로 우 리 는 정례 화 대상 이라는 문 제 를 극복 할 계획 입 니 다(28 줄).일단 우리 가 Create Object 가 돌아 온 값 을 global 에 부여 하면object,우 리 는 여전히 같은 문제 에 부 딪 혀 야 합 니 다-globalobject 는 반환 값 의 던 전 으로 변 하고 다시,globalobject 와 globalobject->me 는 더 이상 같 지 않 을 것 입 니 다.이것 이 두 번 째 이유 입 니 다.하지만,사실 우 리 는 그렇게 멀리 갈 수 없습니다.Create Object 가$object 로 돌아 가면 인용(34 줄)을 파괴 할 것 입 니 다.이것 이 세 번 째 이유 입 니 다.그렇다면 우 리 는 어떻게 이것 을 고 칠 것 입 니까?두 가지 선택 이 있 습 니 다.하 나 는 모든 곳 에&기 호 를 추가 하 는 것 입 니 다.예 를 들 어 6.22 처럼(24,28,31,37 줄).둘째,운 좋게 도 PHP 5 를 사용 했다 면 이 모든 것 을 잊 어도 됩 니 다.PHP 5 는 자동 으로 이러한 문 제 를 고려 할 것 입 니 다.PHP 5 가 어떻게 생각 하 는 지 알 고 싶다 면 계속 읽 어 보 세 요.Listing 6.22 WTMA syndrome in PHP 4 PHP 4 의 WTMA 증후군
1 class MyFoo { 2 function MyFoo() 3 { 4 $this->me = &$this; 5 $this->value = 2; 6 } 7 8 function setValue($val) 9 { 10 $this->value = $val; 11 } 12 13 function getValue() 14 { 15 return $this->value; 16 } 17 18 function getValueFromMe() 19 { 20 return $this->me->value; 21 } 22 }; 23 24 function &CreateObject($class_type) 25 { 26 switch ($class_type) { 27 case "foo": 28 $obj =& new MyFoo(); 29 break; 30 case "bar": 31 $obj =& new MyBar(); 32 break; 33 } 34 return $obj; 35 } 36 37 $global_obj =& CreateObject ("foo"); 38 $global_obj->setValue(7); 39 40 print "Value is " . $global_obj->getValue() . "n"; 41 print "Value is " . $global_obj->getValueFromMe() . "n"; PHP 5 는 대상 을 다른 유형의 데이터 와 다른 PHP 버 전 으로 보 는 첫 번 째 버 전 입 니 다.사용자 의 측면 에서 볼 때 이것 은 매우 명확 한 방식 입 니 다.PHP 5 에서 대상 은 항상 인용 을 통 해 전달 되 고 다른 유형의 데이터(예 를 들 어 integer,string,array)는 모두 값 을 통 해 전달 된다 는 것 을 증명 합 니 다.가장 현저 한 것 은...인용 을 통 해 대상 을 전달 하 는 것 을&기호 로 표시 할 필요 가 없습니다.대상 을 대상 으로 하 는 프로 그래 밍 은 대상 네트워크 와 대상 간 의 복잡 한 관 계 를 광범 위 하 게 이용 하고 있 습 니 다.이것들 은 모두 인용 을 사용 해 야 합 니 다.PHP 의 이전 버 전에 서 는 인용 을 표시 하고 표시 해 야 합 니 다.따라서 현 재 는 기본적으로 인용 으로 대상 을 이동 하고 복 사 를 명확 하 게 요구 할 때 만 대상 을 복사 합 니 다.이렇게 하면 이전 보다 더 좋다.그것 은 어떻게 실현 되 었 을 까?PHP 5 이전에 모든 값 은 zval(Zend Value)이라는 특수 한 구조 에 존재 합 니 다.이 값 들 은 숫자 와 문자열,또는 배열 과 대상 과 같은 복잡 한 값 을 저장 할 수 있 습 니 다.함수 에 전달 되 거나 함수 에서 돌아 올 때 이 값 들 은 복 사 됩 니 다.메모리 의 다른 주소 에 같은 내용 을 가 진 구 조 를 만 듭 니 다.PHP 5 에 서 는 값 이 zval 구조 로 남아 있 습 니 다.단,대상 을 제외 합 니 다.대상 은 Object Store 라 는 구조 에 존재 하고 대상 마다 다른 ID 가 있 습 니 다.Zval 에 서 는 대상 자 체 를 저장 하지 않 고 대상 의 지침 이 저 장 됩 니 다.대상 을 가 진 zval 구 조 를 복사 할 때 예 를 들 어 우 리 는 한 대상 을 매개 변수 로 특정한 함수 에 전달 합 니 다.저 희 는 더 이상 데 이 터 를 복사 하지 않 습 니 다.저 희 는 같은 대상 포인터 만 유지 하고 다른 zval 에서 현재 이 특정한 대상 이 가리 키 는 Object Store 에 알 립 니 다.대상 자체 가 Object Store 에 있 기 때 문 입 니 다.우 리 는 그것 에 대한 어떠한 변화 도 이 대상 의 지침 을 가 진 모든 zval 구조 에 영향 을 줄 것 입 니 다.이러한 부가 적 인 간접 작용 으로 인해 PHP 대상 은 항상 인용 을 통 해 전달 되 고 투명 하고 효율 적 인 방식 으로 보 입 니 다.PHP 5 를 사용 하면 우 리 는 이제 예제 6.21 로 돌아 가 모든&기 호 를 제외 하고모든 코드 는 여전히 정상적으로 작 동 할 수 있 습 니 다.구조 함수(네 번 째 줄)에서 인용 을 가지 고 있 을 때 하나의&기 호 를 사용 하지 않 습 니 다.<전편 완료>

좋은 웹페이지 즐겨찾기