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, 유형, 가격, 설명 등의 필드)... 그런 다음 처리 스크립트에서 검색할 수 있습니다. 데이터베이스에서 유형 값을 가져오고 유형이라는 개체를 인스턴스화합니다.
코드 복사 코드는 다음과 같습니다.
$obj=new $type();
$obj->action()
이것은 PHP의 매우 좋은 기능이므로 그럴 필요가 없습니다. 생각해 보세요. 객체 유형은 표시 메소드나 $obj의 다른 메소드를 호출하세요. 이 기술을 사용하면 새로운 유형의 개체를 추가하기 위해 스크립트를 수정할 필요가 없으며 이를 처리하기 위한 클래스만 있으면 됩니다.
이 기능은 매우 강력합니다. 모든 개체의 유형을 고려하지 않고 메서드를 정의하고, 다른 메서드의 다른 클래스에서 구현한 다음 기본 스크립트의 모든 개체에 사용하면 됩니다. if...else가 필요하지 않습니다. 프로그래머 두 명에게는
그저 행복할 뿐입니다.
이제 프로그래밍이 쉽고 유지 관리 비용이 저렴하며 재사용이 가능하다는 점에 동의하시나요?
프로그래머 그룹을 관리하는 경우 작업 할당은 간단합니다. 각 사람은 개체 유형과 이를 처리하는 클래스를 담당할 수 있습니다.
이 기술을 통해 국제화는 가능하며, 사용자가 선택한 언어 분야 등에 따라 해당 클래스를 적용하면 됩니다.
복사 및 복제
$obj의 객체를 생성할 때 $obj2=$obj로 객체를 복사할 수 있습니다. 새 객체는 $obj의 복사본이므로(참조가 아님) $ 당시 obj의 상태입니다. 때로는 obj 클래스와 같은 새 개체를 생성하고 싶지 않을 수도 있습니다. new 문을 사용하여 클래스의 생성자를 호출할 수 있습니다. 이는 직렬화 및 기본 클래스를 통해 PHP에서도 달성할 수 있지만 다른 모든 클래스는 기본 클래스에서 파생되어야 합니다.
위험 구역 진입
객체를 직렬화하면 어떤 형식의 문자열이 나오며, 관심이 있으면 조사할 수 있는데, 문자열에 클래스 이름( ! ), 다음과 같이 꺼낼 수 있습니다:
코드 복사 코드는 다음과 같습니다:
php
$herring=serialize($obj);
$vec=explode(':',$herring)
$nam=str_replace(""",'',$vec[2]) ;
따라서 "유니버스" 클래스를 만들고 모든 클래스가 유니버스에서 확장되도록 한다고 가정하면 다음과 같이 유니버스에서 복제 메서드를 정의할 수 있습니다.
코드 복사 코드는 다음과 같습니다.
function clone() {
$herring=serialize($this)
$vec=explore(' :',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
//그런 다음
$obj=new Something();
//우주에서 확장
$other=$obj->clone()
얻는 것은 new 메소드를 사용하고 생성자를 호출하여 생성된 객체와 동일한 새로운 Something 클래스 객체입니다. 이것이 여러분에게 유용한지는 모르겠지만 Universe 클래스는 파생 클래스입니다. 유일한 제한은
문이 현재 시간에 기록된다는 것입니다.
위 내용은 betty boop의 내용을 포함하여 betty boop PHP 고급 OOP 기술 데모를 소개한 내용입니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.