문제

PHP 변수에 대한 모든 변경 사항을 추적하려고합니다. 변수는 객체 또는 배열 일 수 있습니다.

예를 들어 다음과 같은 것 같습니다.

$object = array('a', 'b');

그런 다음이 객체는 객체 캐시를 사용하여 스토리지로 지속됩니다. PHP 스크립트가 다시 실행될 때.

따라서 스크립트가 두 번째로 실행되거나 다른 스크립트가 실행되고 해당 객체를 수정하면 해당 수정이 수행 될 때 또는 스크립트가 실행 된 후 한 번에 수정을 추적하기를 원합니다.

예 :

$object[] = 'c';

'C'가 객체에 추가되었다는 것을 알고 싶습니다.

이제 실제로 코드는 다음과 같습니다.

$storage = new Storage();
$storage->object = array('a', 'b');

두 번째로드 :

$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

$storage->object[] = 'c';

내가 알고 싶은 것은 'C'가 $ Storage-> Object로 밀려 나서 클래스 "저장소"에서 해당 값을 영구 저장소로 설정할 수 있다는 것입니다.

나는 몇 가지 방법과 그 일을 시도했지만 단점이 있습니다.

1) 객체의 변경 사항을 추적하는 클래스 "저장 가능한"클래스에 모든 객체를 감싸십시오.

"Storable"클래스는 실제 데이터 객체를 속성으로 저장 한 다음 __get () 및 __set () 메소드를 제공하여 액세스 할 수 있습니다. 오브젝트의 멤버/속성이 수정되거나 추가되면 "저장 가능한"클래스는 이것을 기록합니다. AA 속성에 액세스 할 때 저장 가능한 클래스의 __get ()가 재산을 반환하고 다른 저장 가능한 클래스로 싸서 각 새로운 레벨마다 재귀 적으로 추적되도록합니다.

문제는 객체가 더 이상 기본 데이터 유형이 아니므로 배열에서 배열 함수를 실행할 수 없다는 것입니다.

예 :

$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

array_push($storage->object, 'c'); // fails

대신 우리는 이러한 배열 기능을 저장 가능한 방법으로 구현해야합니다.

예 :

$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

$storage->object->push('c');

이것은 모두 좋지만, 어떻게 든 기본 함수를 사용하여 개발중인 라이브러리의 오버 헤드를 줄이고 변경 사항을 추적하여 변경 사항을 지속적으로 스토리지에 추가 할 수 있는지 알고 싶습니다.

2) 변경 사항 추적을 잊고 전체 객체 구조를 업데이트하기 만하면됩니다.

이것은 프로그램의 객체를 실제로 객체 캐시에 저장된 객체 (다른 기계에있을 수 있음)와 동기화하는 가장 간단한 방법입니다.

그러나 단일 인덱스가 변경되면 1000 개의 인덱스가있는 배열과 같은 전체 구조가 소켓을 객체 캐시로 보내야한다는 것을 의미합니다.

3) 물체의 거울을 로컬로 유지하십시오

나는 또한 물체를 복제하고 클론 객체를 그대로 유지하려고 시도했다. 그런 다음 모든 처리가 PHP 스크립트에 의해 수행되면 클론을 수정 된 객체와 재귀 적으로 비교하고 변경된 속성을 객체 캐시에 다시 제출하십시오.

그러나 사용하려면 전체 객체를 다운로드해야합니다. 또한 객체가 복제되기 때문에 객체가 두 배나 많은 메모리를 차지해야합니다.


나는 이것이 꽤 모호하다는 것을 알고 있지만, 약간의 코드가 관련되어 있습니다. 누구든지 코드를보고 싶다면 내가 게시하거나 열린 SVN Repo에 올릴 수 있습니다. 이 프로젝트는 오픈 소스이지만 아직 공개 저장소를 설정하지 않았습니다.

도움이 되었습니까?

해결책

'객체'는 실제로 배열이므로 기능을 추가 할 수 없습니다. 클래스 방법으로 캡슐화한다는 아이디어는 올바른 접근법입니다. 이 단계에서 적절한 디자인에 대한 성능에 대한 걱정은 관련이없고 잘못 안내됩니다.이 접근법으로 발생하는 오버 헤드는 전반적인 응용 프로그램 성능에 중요하지 않을 수 있습니다.

SPL 어레이 클래스를 조사해야합니다. ArrayObject. 그들은 완전한 배열과 같은 인터페이스를 제공하며 쉽게 확장 할 수 있습니다.

다른 팁

모든 정직으로 나는 당신이하는 일을 재고 할 것입니다. 당신은 정말로 PHP를 그렇지 않은 것으로 바꾸려고 노력하고 있습니다. 이것은 기본적으로 일시적으로 일시적인 PHP가 아닌 Java 및 C#에서 볼 수있는 ORM의 종류입니다 (모든 의미, Memcache/APC/등은 각 요청에 따라 재현됩니다). 이것은 정교한 객체 캐싱 및 변경 추적에 대한 혐오입니다.

즉, 이것을 할 수있는 유일한 방법은 모든 것을 과부하시키는 것입니다. __get(), __set() 그리고 __isset() 그리고 구현 ArrayAccess.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top