[PHP] Attribuut in klasse vernietigd?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Beste,

Ik ben op een fout gestoten in mijn MVC model waar ik al een paar dagen zit achter zoeken maar zonder resultaat. De fout is dat wanneer ik de functie doe(showProductLijst) oproep hij telkens geef dat ik een functie oproep van een niet bestaand object. Volgens mij komt dit omdat hij in de functie init() deze initialiseert en daarna terug weggooit.. Hoe los ik dit op? De fout geeft hij op deze lijn :

PHP:
1
$res = $this->security->requestProductLijst($_lijst);


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 <?php
    class IO
    {
        //Attributes
        private $ui;
        private $dc;
        private $eh;
        private $security;
        private $login;
        
        //Constructors
        function __construct(){    
        }
        
        //Setters
        public function zet_ui($_ui){$this->ui=$_ui;}
        public function zet_dc($_dc){$this->dc=$_dc;}
        public function zet_eh($_eh){$this->eh=$_eh;}
        public function zet_login($_login){$this->login=$_login;}
        
        //Getters
        public function geef_ui(){return $this->ui;}
        public function geef_dc(){return $this->dc;}
        public function geef_eh(){return $this->eh;}
        public function geef_login(){return $this->login;}
        
        //Methods
        public function init()
        {
            //$this->security = new GastSecurity();
            $this->security = $this->login->maakGastSecurity();
            $this->ui->redirect("Ontvang.php?_actie=showIndex");
        }

        
        public function doe($_lijst)
        {
            $actie = $_lijst["_actie"];
            unset($_lijst["_actie"]);
           // $this->security = $this->login->maakGuestSecurity();
            switch($actie)
            {

                           case "showProductLijst" :   $res = $this->security->requestProductLijst($_lijst);
                                        // $this->ui->show_ProductLijst($res,$this->dc->requestProductFilter());
                                         break;

default : $lijst = array();
                       $lijst["_ref"]=$_SERVER['HTTP_REFERER'];
                       $lijst["_error"]="Geen data meegegeven.";
                       $this->ui->maak_form("Error", $lijst);
                       break;
                     
            }
        }
        
    }
?>


De functie in de login class geeft wel degelijk een security object weer. En de login variabele in klasse IO wordt bij de initialisatie opgevuld door een nieuw object van Login.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Volgens mij komt dit omdat hij in de functie init() deze initialiseert en daarna terug weggooit.
Onmogelijk. Er worden nooit zomaar variabelen leeggegooid.

Zonder de code waarmee je deze methoden aanroept kunnen we niets. Heb je al eens een exceptie gethrowd waarmee je de stacktrace kunt bekijken? En voer je init() wel op hetzelfde object uit als waar je doe() op uitvoert?

offtopic:
Nederlandse naamgeving in programmacode :'(

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ja, roep doe op via ontvang.php. Met trow execptions ben ik niet vertrouwd dus heb ik deze ook nog niet uitgevoerd. IK zal de andere files hier ook eens posten.

index.php
PHP:
1
2
3
4
5
6
7
8
<?php
    session_start();
    require_once("config.inc");
    require_once("rss.php");
    require_once("autoload.inc");
    $app = new Applicatie();
    $app->init();
?>

Applicatie.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
    class Applicatie
    {
        private $io;
        private $ui;
        private $dc;
        private $eh;
        private $pers;
        private $login;
                
        function __construct()
        {
        }
        
        public function init()
        {
            $this->io = new IO();
            $this->ui = new UI();
            $this->dc = new DC();
            $this->eh = new EH();
            $this->pers = new Persistentie();
            $this->login = new Login();

            
            $this->io->zet_ui($this->ui);
            $this->io->zet_dc($this->dc);
            $this->ui->zet_io($this->io);
            $this->dc->zet_eh($this->eh);
            $this->dc->zet_pers($this->pers);
            $this->eh->zet_io($this->io);
            $this->eh->zet_dc($this->dc);
            $this->io->zet_eh($this->eh);
            $this->io->zet_login($this->login);

            
                                    
            $_SESSION["io"] = serialize($this->io);
            $_SESSION["ui"] = serialize($this->ui);
            $_SESSION["dc"] = serialize($this->dc);
            $_SESSION["eh"] = serialize($this->eh);
            $_SESSION["pers"] = serialize($this->pers);
            $_SESSION["login"] = serialize($this->login); 
            $this->io->init();
            return $this->io;
        }
        
    }
?>

Ontvang.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
    
    session_start();
    require_once("autoload.inc");
    if(isset($_POST["_actie"]) && $_POST["_actie"]!="")
    {
        var_dump($_POST["_actie"]);
        echo '<br />';
     $obj = unserialize($_SESSION["io"]);
     $obj->doe($_POST);
    }
    else if(isset($_GET["_actie"]) && $_GET["_actie"]!="")
    {
     $obj = unserialize($_SESSION["io"]);
     $obj->doe($_GET);
    }
    else
    {
      $url = array();
      $url["actie"]="showError";
      $url["error"]="Geen actie meegegeven";
      $url["ref"]=$_SESSION["root_rel"];
      $obj  = unserialize($_SESSION["io"]);
      $obj->doe($url);
    }

?>

Login.php

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
  class Login{
  
      private $io;
      private $dc;
      private $security;
      
      function __construct()
      {
      
      }
      
      public function zet_io($_io){$this->io=$_io;}        
        public function zet_dc($_dc){$this->dc=$_dc;}
        public function zet_security($_security){$this->security=$_security;}
        
        //Getters
        public function geef_io(){return $this->io;}
        public function geef_dc(){return $this->dc;}
        public function geef_security(){return $this->security;}
      
      public function maakGastSecurity()
        {
            $this->security = new GastSecurity();
            $this->security->zet_io($this->io);
            $this->security->zet_dc($this->dc);
            return $this->security;
        }
  }
  
  
?>


GastSecurity.php

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
 class GastSecurity extends Security
 {
        private $io;
        private $dc;
        private $pers;
     
     function __construct()
     {
     
     }
     
        public function zet_io($_io){$this->io=$_io;}
        public function zet_dc($_dc){$this->dc=$_dc;}
        
        //Getters
        public function geef_io(){return $this->io;}
        public function geef_dc(){return $this->dc;}
        
         public function requestProductLijst($_lijst)
        {
          return $this->dc->requestProductLijst($_lijst);
        }

 }  
?>

[ Voor 4% gewijzigd door Droned op 22-05-2009 09:52 ]


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Misschien zit het probleem in deze regel in init()?

code:
1
$this->ui->redirect("Ontvang.php?_actie=showIndex");


Ik weet niet wat 'ie doet, maar als deze de gebruiker van de site een redirect geeft, ben je natuurlijk je variabelen kwijt (aangezien het script stopt na een redirect).

Sowieso ben ik meer een fan van het van buitenaf toekennen van attributen van objecten. In dit geval zou ik je Security object elders aanmaken en via de ctor van deze IO klasse toekennen. De ctor van de IO class doet een check op null van het security object, en gooit een exception (oid) indien deze null is.

Zo kan je IO object nooit in een verkeerde 'state' verkeren, dwz dat hij 'bestaat' zonder een geldig Security object, en zo krijg je gelijk een foutmelding als hij geen goed Security object krijgt.

[ Voor 46% gewijzigd door YopY op 22-05-2009 10:35 ]


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Uhu, maar alles dat ik oproep in de functie doe() gaat via ontvang.php?_actie=xxxxx. Hoe kan ik dan oplossen dat hij die login en security behoud van in het begin bij de init?

EDIT:

Als ik je redenering goed volg, dan zeg je dat ik in Apllicatie best een nieuw object aanmaakt van Security en dit dan in de constructor van IO toewijzen aan de variabele $security?

[ Voor 35% gewijzigd door Droned op 22-05-2009 10:41 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

YopY schreef op vrijdag 22 mei 2009 @ 10:33:
Misschien zit het probleem in deze regel in init()?

code:
1
$this->ui->redirect("Ontvang.php?_actie=showIndex");


Ik weet niet wat 'ie doet, maar als deze de gebruiker van de site een redirect geeft, ben je natuurlijk je variabelen kwijt (aangezien het script stopt na een redirect).
Ik weet niet wat het verwachte gedrag is van een unserialize() operatie op een serialize()d object uit $_SESSION, maar bij mij geeft het vreemde resultaten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
session_start();
class A {
  private $_string = "C";
  public function setString($string) {
    $this->_string = $string;
  }
  public function __toString() {
    return $this->_string;
  }
}

class B {
  private $_a = null;
  public function setA($a) {
    $this->_a = $a;
  }
  public function __toString() {
    return 'My $b is "' . $this->_a . '"';
  }
}

$a = new A();

if (!isset($_SESSION['b'])) {
  print "Creating new \$b \n";
  $b = new B();
  $b->setA($a);

  $a->setString("string A");
  $_SESSION["b"] = serialize($b);
} else {
  print "Loaded \$b from session\n";
  $b = unserialize($_SESSION['b']);
  unset($_SESSION['b']);
}

print $b . PHP_EOL;

// change the value of $a. When $b is unserialized, the reference to $a is lost and the value of $b->_a won't change
$a->setString("string B");

print $b . PHP_EOL;

Voer deze code maar eens twee keer uit.


Maar waarom serialize je alles? Heeft dat voordeel? Resources zoals databaseconnecties worden toch niet opgeslagen, en je hebt nog weer extra disk I/O bij het aanroepen van je script.

[ Voor 7% gewijzigd door CodeCaster op 22-05-2009 10:41 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
CodeCaster schreef op vrijdag 22 mei 2009 @ 10:37:
[...]

Ik weet niet wat het verwachte gedrag is van een unserialize() operatie op een serialize()d object uit $_SESSION, maar bij mij geeft het vreemde resultaten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
session_start();
class A {
  private $_string = "C";
  public function setString($string) {
    $this->_string = $string;
  }
  public function __toString() {
    return $this->_string;
  }
}

class B {
  private $_a = null;
  public function setA($a) {
    $this->_a = $a;
  }
  public function __toString() {
    return 'My $b is "' . $this->_a . '"';
  }
}

$a = new A();

if (!isset($_SESSION['b'])) {
  print "Creating new \$b \n";
  $b = new B();
  $b->setA($a);

  $a->setString("string A");
  $_SESSION["b"] = serialize($b);
} else {
  print "Loaded \$b from session\n";
  $b = unserialize($_SESSION['b']);
  unset($_SESSION['b']);
}

print $b . PHP_EOL;

// change the value of $a. When $b is unserialized, the reference to $a is lost and the value of $b->_a won't change
$a->setString("string B");

print $b . PHP_EOL;

Voer deze code maar eens twee keer uit.


Maar waarom serialize je alles? Heeft dat voordeel? Resources zoals databaseconnecties worden toch niet opgeslagen, en je hebt nog weer extra disk I/O bij het aanroepen van je script.
De reden waarom ik ze serialize is om ze mee te kunnen nemen naar pagina's zoals Ontvang.php. Omdat deze onafhankelijk werkt van mijn mvc model kent hij deze klasse niet, en doe ik dus een unserialize om deze in een object te steken en dan vervolgens de method doe() op te roepen van IO.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Weet wel dat PHP het serializen van objecten in sessions al voor je doet, inclusief het unserializen. Je bent in de praktijk dus een gewoon object aan het unserializen. Laat al het serializen/unserializen van objecten in de _SESSION variabele dan ook gewoon aan PHP over.
Pagina: 1