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