PHP Nesne özellik değişikliklerini izleme

2 Cevap php

Ben bir PHP değişkeni yapılan tüm değişiklikleri izlemek için çalışıyorum. Değişken bir nesne ya da dizi olabilir.

Örneğin o şey gibi görünüyor:

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

Bu nesne daha sonra bir nesne önbelleğini kullanarak depolama kalıcıdır. Php script yeniden çalıştırıldığında.

Komut ikinci kez çalıştırılır, ya da başka bir komut çalıştırır ve değiştiren nesneyi, ben bu değişiklikler izlenebilir istiyorum, ya onlar yapılıyor gibi, ya da tek seferde Yani komut dosyasını çalıştırdıktan sonra.

örneğin:

$object[] = 'c';

Ben 'c' nesnesine eklenmiş olduğunu bilmek istiyorum.

Şimdi aslında kod şöyle:

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

İkinci yük:

$storage = new Storage();

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

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

Ne bilmek istiyorum sınıfında "Depolama" Ben kalıcı depolama için bu değeri ayarlayabilirsiniz böylece 'c' $ depolama-> nesne içine itilmiş olmasıdır.

Ben birkaç yöntem, bu işi denedi, ama olumsuz yanları var var.

1) Wrap all objects in a class "Storable" which tracks changes to the object

The class "Storable" just saves the actual data object as a property, and then provides __get() and __set() methods to access it. When a member/property of the object is modified or added, the "Storable" class notes this. When a a property is accessed __get() on the Storable class returns the property, wrapped in another Storable class so that changes on that are tracked also, recursively for each new level.

Sorun nesneler artık yerel veri türleri vardır ve böylece diziler dizi fonksiyonları çalıştırmak değil ki.

örneğin:

$storage = new Storage();

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

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

Yani yerine biz depolanabilir yöntemleri gibi bu dizi fonksiyonlarını uygulamak gerekiyor.

örneğin:

$storage = new Storage();

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

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

Bu, tüm iyi, ama ben bu yüzden herhangi bir değişiklik kalıcı depolama eklenebilir, olası bir şekilde doğal işlevleri kullanmayı bilmek istiyorum değişiklikleri takip ederken, ben geliştiriyorum kütüphanesine yükü azaltmak için.

2) Forget about tracking changes, and just update whole object structures

Bu aslında nesne önbelleği (ki farklı bir makinede olabilir) depolanan nesneler ile senkronize programda nesneleri tutmanın en basit yöntemdir.

Ancak, 1000 indeksleri ile bir dizi gibi bütün yapılar, nesne önbelleği, tek bir dizin değişikliği için bir soket olsa gönderilmek zorunda kalıyoruz.

3) Keep a mirror of the object locally

Ben de nesne klonlama, ve el değmemiş bir klon nesneyi tutarak denedim. Tüm işlem PHP komut dosyası tarafından yapılır o zaman, ardışık değiştirilmiş nesnesine klon karşılaştırmak ve geri göndererek nesne önbelleğe özelliklerini değiştirdi.

This however requires that the whole object be downloaded in order to use it. It also requires that the object take up twice as much memory, since it is cloned.


Ben bu oldukça muğlak olduğunu biliyorum, ancak ilgili bir kod biraz var. Herkes kodu görmek istiyorsa onu göndermek, veya açık bir SVN repo üzerine koyabilirsiniz. Proje açık kaynak ama ben henüz bir kamu depo kurmak değil.

2 Cevap

Senin 'nesne' gerçekten bir dizi olduğundan, ona işlevsellik eklemek olamaz. Sınıf yöntemleri ile kapsüllenmesinde senin fikrin doğru yaklaşımdır. Bu aşamada uygun tasarımı üzerinde performans endişesi alakasız ve yanlış - Eğer bu yaklaşım ile tabi havai olasılıkla genel uygulama performansı için önemsiz olacaktır.

Bu tür ArrayObject olarak SPL dizi sınıfları içine bakmak gerekir. Onlar tam bir dizi benzeri bir arayüz sağlamak ve kolayca uzatılabilir vardır.

Tüm dürüstlük Ben ne yaptığınızı gözden geçireceklerini. Sen gerçekten olmayan bir şey haline PHP açmak için çalışıyoruz. Bu doğada temelde geçicidir Java ve C # değil PHP, gördüğünüz ORM türüdür (memcache / APC / etc kısıtlama herşeyi, yani, her istek üzerine yeniden oluşturulur). Bu sofistike nesne önbelleğe alma ve değişiklik izleme aforoz olduğunu.

Söyleniyor, bunu yapabileceği tek yolu __get(), __set() ve __isset() ve uygular overloads şey her şeyi sarmak olduğunu ArrayAccess .