Ben bir OTURUM değişken olarak bir PHP sınıfı örneğini saklayamazsınız Neden

6 Cevap php

I have a PHP script that is called in 2 ways from a Dojo Ajax xhrGet call. The first time it is called with an "init" argument which causes the script to create an instance of the StateList class and read in a file of state names.

session_start();
@include('StateList.php');
require_once('phplog.php');

//start executing here
$comd=$_GET['nexturl'];
if($comd=="init") {
$st = new StateList("../data/statestxt.txt");
$_SESSION['statefile'] = $st;
}

İkinci ve daha fazla kez, başka xhrGet çağrı "getstate" argüman geçer ve aşağıdaki kod OTURUM diziden EyaletListesi sınıfının Ofr örneği almak için çalışır.

if($comd =="getstate") {
$st= $_SESSION['statefile'];
phplog("size=".$st->getSize());

}

However, the getSize() method is never executed, nor can I call any other method on the reconstituted StateList class instance.

Note that this is one PHP script that DOES include the class definition at the top and thus the class methods should be known and avaialble.

Ben burada ne eksik?

6 Cevap

Eğer aksi nesnesi düzgün serisi olmayacak, session_start() çağrı ve bir örneği olacaktır önce sınıf tanımı dahil etmek gerekir __PHP_Incomplete_Class. Aksi takdirde ne var para cezası çalışması gerekir.

Bunu saklamak önce serialize $ st nesne / değişken gerekebilir. Bu her şeyin oturuma kaydedilir sağlayacaktır. Bu kesinlikle object oriented kodu için gitmek yoludur. Tekrar verileri kullanmak istediğinizde, unserialize o olmalı.

Bu izolasyon hata ayıklamak zor şeylerden biridir. PHP Sessions örneği nesneleri saklamak her zaman biraz zor, değil% 100 iş garantili. İşte bu anlamaya yardımcı olabilecek bazı genel hata ayıklama ipuçları bulunuyor

İlk olarak, apache hata günlüğünü denetleyin. Eğer bir "non-nesne hatası denilen yöntemi" alıyor musunuz? Eğer hayır ise, bu oturumun bir nesneyi geri alma değil demektir. Değilse, yöntem çağrısı başka bir nedenden dolayı başarısız olduğu belirtilen bir hata var mı?

İkinci olarak, gerçekten oturumu çıkıyorum ne yaptığınızı görmek için kontrol edin.

if($comd =="getstate") {
	$st= $_SESSION['statefile'];
	//get the class of st
	phplog("instance=".get_class($st));

	//get a reflection dump of st
	$ref = new ReflectionClass($st);
	$string = $ref->__toString();		
	phplog("reflection=".$string);
}

Üçüncü olarak, oturumda kendisi saklanan ediliyor tefrika dize değerine bakmak. Aslında bir tefrika nesneyi depolamak? Sizin dev ortamında, / tmp gibi bir şey için php.ini içinde session.save_path ini değerini ayarlayın (ya da aynı şeyi yapmak için ini_set yöntemi kullanın)

session.save_path = "/tmp"

ve sonra / tmp (veya ne olursa olsun klasör) oluşturulan dosyaları inceleyin. Sen başlayan bir dize görmelisiniz

statefile:O:..........

Nesneyi örneği sınıfın adı aynı zamanda orada yer alan, hem de özellikleri kaydedilen değerler olacaktır.

Eğer olmalı oturumda bir nesneyi saklamak için gidiyoruz eğer link text. PHP nesneleri seri, Dursun oturumda saklayarak sorunların bir yeri vardır. Ben tamamen bu yapıyor ve sorun için farklı bir çözüm bulma karşı tavsiye. Eğer olsa bunu yapmak için gidiyoruz, sen bunu oturumdan çağrıldığı zaman reinstantiation bulunuyor kolaylaştırmak için sınıfta tanımlamak gerekir 'sihirli yöntemler' link text içine bakmak gerekir.

Eğer session.auto_start etkin var mı? Manuelin oturumu sayfası yaparsanız, farklı sınıf tanımı yüklemek zorunda olduğunu belirtiyor:

Eğer session.auto_start açarsanız sonra oturumları içine nesneleri koymak için tek yol sizin nesneyi serialize ve sonradan unserialize zorunda olacak başka sınıf tanımını yüklemek hangi auto_prepend_file kullanarak bir sınıf tanımı yüklemektir.

http://php.net/manual/en/intro.session.php

Bu sayfa dediği gibi, nesne serileştirme / unserialization normalde PHP tarafından otomatik olarak yapılacaktır, ancak session.auto_start bu değişecektir etkin olan.

Bu deneyin:

    include('StateList.php');
    require_once('phplog.php');
    // start your session after including your class file
    session_start();

    //start executing here
    $comd=$_GET['nexturl'];
    if($comd=="init") {
    $st = new StateList("../data/statestxt.txt");
    $_SESSION['statefile'] = $st;
    } 

    if($comd =="getstate") {
    // the ampersand creates a reference, preserving any further changes to your session data
    $st = &$_SESSION['statefile'];
    phplog("size=".$st->getSize());
    }