개요: 이 기사에서 저자는 OOP 개념에 대한 이해를 바탕으로 예제를 통해 PHP의 다양한 고급 OOP 기술을 보여줍니다. 저자가 말했듯이 "
기본적인 OOP 개념을 이해하면
상상력이 유일한 한계입니다."더욱 발전된 기술을 선보일 예정입니다.
직렬화(Serializing)
PHP는 영속 객체를 지원하지 않습니다. OOP에서 영속 객체는 여러 애플리케이션의 참조 사이에서 상태와 기능을 유지할 수 있는 객체입니다. 이는 객체를 파일이나 데이터베이스에 저장하고 로드하는 기능을 의미합니다. 나중에 이의를 제기하세요. 이것이 소위 직렬화 메커니즘입니다. PHP에는 객체에 대해 호출할 수 있는 직렬화 메서드가 있으며 직렬화 메서드는 객체의 문자열 표현을 반환할 수 있습니다. 그러나 직렬화는 메서드가 아닌 개체의 멤버 데이터만 저장합니다.
PHP4에서는 객체를 문자열 $s로 직렬화한 다음 객체를 해제하고 객체를 $obj로 역직렬화하면 객체의 메서드를 계속 사용할 수 있습니다! (a) 이 동작이 향후 버전에서도 계속 작동할 것이라는 보장이 문서에 없기 때문에 나는 이 작업을 권장하지 않습니다. (b) 직렬화된 버전을 디스크에 저장하고 스크립트를 종료할 때 오해가 발생할 수 있습니다. 나중에 이 스크립트를 실행하면 문자열 표현에 메서드가 전혀 포함되지 않기 때문에 개체를 역직렬화할 때 개체의 메서드가 있을 것이라고 기대할 수 없습니다.
전체적으로, PHP의 직렬화는 객체의 멤버 변수를 저장하는 데 매우 유용합니다. (관련 배열 및 배열을 파일로 직렬화할 수도 있습니다).
예:
<?php
$obj=new Classfoo();
$str=serialize($obj);
//$str을 디스크에 저장
//몇 달 후
//디스크에서 str 로드
$obj2=직렬화 해제($str)
문서에 따르면 멤버 데이터는 복원했지만 메서드는 복원하지 않았습니다. 결과적으로 $obj2->x를 사용하는 것과 같은 방식으로 멤버 변수에 액세스할 수 있는 유일한 방법(다른 방법은 없습니다!)이 발생하므로 집에서 시도하지 마세요.
이 문제를 해결할 수 있는 몇 가지 방법이 있습니다. 이 간결한 기사에는 너무 좋지 않기 때문에 생략하겠습니다. 나는 PHP의 후속 버전에서 완전히 직렬화된 기능을 환영합니다.
데이터 저장을 위한 클래스 사용 PHP와 OOP의 가장 큰 장점 중 하나는 작업을 수행하기 위한 클래스를 쉽게 정의하고 이를 사용하고 싶을 때마다 해당 클래스를 호출할 수 있다는 것입니다. 사용자가 제품 ID 번호를 선택하여 제품을 선택할 수 있는 HTML 양식이 있다고 가정합니다. 데이터베이스에 상품 정보가 있는데, 상품, 가격 등을 표시하고 싶습니다. 다양한 유형의 제품이 있으며 동일한 작업이라도 제품마다 다른 의미를 가질 수 있습니다. 예를 들어, 소리를 표시한다는 것은 소리를 재생하는 것을 의미할 수 있지만 다른 종류의 제품에서는 데이터베이스에 저장된 이미지를 표시하는 것을 의미할 수 있습니다. OOP 또는 PHP를 사용하여 코딩을 줄이고 품질을 향상시킬 수 있습니다.
제품 클래스를 정의하고, 있어야 하는 메소드(예: 디스플레이)를 정의한 다음 제품 클래스(SoundItem 클래스, ViewableItem 클래스 등)에서 파생된 각 제품 유형에 대한 클래스를 정의하여 제품을 포괄합니다. 원하는 대로 동작하도록 만드는 수업입니다.
데이터베이스에 있는 각 제품의 유형 필드에 따라 클래스 이름을 지정합니다. 일반적인 제품 테이블에는 (ID, 유형, 가격, 설명 등의 필드)... 그런 다음 처리 스크립트에서 데이터베이스에서 검색할 수 있습니다. 에서 유형 값을 가져온 다음 유형이라는 객체를 인스턴스화합니다.
<?php
$obj=new $type();
$obj->action();
이것은 PHP의 아주 좋은 기능입니다. 객체의 유형을 고려하지 않고 $obj의 표시 메소드나 다른 메소드를 호출할 수 있습니다. 이 기술을 사용하면 새로운 유형의 개체를 추가하기 위해 스크립트를 수정할 필요가 없으며 이를 처리하기 위한 클래스만 있으면 됩니다.
이 기능은 매우 강력합니다. 모든 객체의 유형을 고려하지 않고 메소드를 정의하고, 이를 다른 클래스에서 다른 메소드로 구현한 다음 모든 객체에 대한 기본 스크립트에서 사용합니다. no if...else, no 두 명의 프로그래머가 필요합니다. 단지 행복합니다.
이제 프로그래밍이 쉽고 유지 관리 비용이 저렴하며 재사용이 가능하다는 점에 동의하시나요?
프로그래머 그룹을 관리하는 경우 작업 할당은 간단합니다. 각 사람은 개체 유형과 이를 처리하는 클래스를 담당할 수 있습니다.
이 기술을 통해 국제화는 가능하며, 사용자가 선택한 언어 분야에 따라 해당 클래스를 적용하는 등의 작업만 하면 됩니다.
복사 및 복제
$obj 객체를 생성할 때 $obj2=$obj로 객체를 복사할 수 있습니다. 새 객체는 $obj의 복사본(참조가 아님)이므로 당시의 상태는 $obj입니다. . 때로는 obj 클래스와 같은 새 개체를 생성하고 싶지 않을 수도 있습니다. new 문을 사용하여 클래스의 생성자를 호출할 수 있습니다. 이는 직렬화 및 기본 클래스를 통해 PHP에서도 달성할 수 있지만 다른 모든 클래스는 기본 클래스에서 파생되어야 합니다.
위험 영역 진입
객체를 직렬화하면 어떤 형식의 문자열을 얻게 되는데, 관심이 있는 경우 질문할 수 있습니다. 문자열에 클래스 이름이 있고(좋습니다!) 이를 입력할 수 있습니다. 다음과 같이 처리됩니다:
<?php
$herring=serialize($obj);
$vec=explode(':',$herring);
$nam=str_replace(""",'',$vec[2]) ;
따라서 "유니버스" 클래스를 만들고 모든 클래스를 유니버스에서 확장한다고 가정하면 다음과 같이 유니버스에서 복제 메서드를 정의할 수 있습니다.
<?php
function clone() {
$herring=serialize($ this)
; 폭발(':',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
/ /Then
$obj=new Something();
//우주에서 확장
$other=$obj->clone();
당신이 얻는 것은 new 메서드를 사용하고 생성자를 호출하여 생성된 객체와 동일한 새로운 Something 클래스 객체입니다. 이것이 당신에게 효과가 있을지는 모르겠지만 유니버스 클래스가 파생 클래스의 이름을 알고 있다는 것은 경험상 좋은 규칙입니다. 상상력이 유일한 한계입니다.
이 문은 현재 시간을 씁니다.