[Opgelost]Vreemd gedrag unset ()
in de onderstaande code gedraagt de methode resetErrors () zich vreemd:
Code (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
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
<?php
// file classes.php
class A
{
private $errors;
public function A ()
{
$this -> errors = array ();
}
public function getErrors ()
{
return $this -> errors;
}
public function resetErrors ()
{
unset ($this -> errors);
$this -> errors = array ();
}
public function doSomeThing ()
{
B::doSomeThing ($this -> errors);
}
}
class B
{
public static function doSomeThing (&$errors)
{
if (1>2)
$errors [] = "No, it is not possible";
else
$errors [] = "YES";
}
}
class C
{
public static function getErrorMessage ($errors)
{
$result = "";
foreach ($errors as $error)
$result .= $error;
return $result;
}
}
?>
// file classes.php
class A
{
private $errors;
public function A ()
{
$this -> errors = array ();
}
public function getErrors ()
{
return $this -> errors;
}
public function resetErrors ()
{
unset ($this -> errors);
$this -> errors = array ();
}
public function doSomeThing ()
{
B::doSomeThing ($this -> errors);
}
}
class B
{
public static function doSomeThing (&$errors)
{
if (1>2)
$errors [] = "No, it is not possible";
else
$errors [] = "YES";
}
}
class C
{
public static function getErrorMessage ($errors)
{
$result = "";
foreach ($errors as $error)
$result .= $error;
return $result;
}
}
?>
en het bestand index.php:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// file index.php
include_once 'classes.php';
session_start ();
if (!isset ($_SESSION ['test'])
$_SESSION ['test'] = new A ();
$_SESSION ['test'] -> doSomeThing ();
echo '<html><head><title>TEST</title></head><body>' .
C::getErrorMessage ($_SESSION ['test'] -> getErrors ()) .
'</body></html>';
$_SESSION ['test'] -> resetErrors ();
?>
// file index.php
include_once 'classes.php';
session_start ();
if (!isset ($_SESSION ['test'])
$_SESSION ['test'] = new A ();
$_SESSION ['test'] -> doSomeThing ();
echo '<html><head><title>TEST</title></head><body>' .
C::getErrorMessage ($_SESSION ['test'] -> getErrors ()) .
'</body></html>';
$_SESSION ['test'] -> resetErrors ();
?>
Als de code wordt uitgevoerd is, is de array errors bij het uitvoeren van getErrorMessage () leeg.
Nu als ik de laatste regel weg haal (dus $_SESSION ['test'] -> resetErrors ();) dan verschijnt het error-bericht wel op het scherm maar oude berichten blijven in de array.
Heeft iemand enig idee hoe dit komt?
Alvast bedankt!
Gewijzigd op 08/06/2011 00:18:54 door M A
Geen idee of het enig effect heeft, maar moet in $this -> erros = array (); (regel 10, classes.php) niet errors zijn?
Unset verwijderd de gegeven variabele, waardoor officieel de variabale $this->errors niet meer bestaat, dus daarna deze weer aanmaken is onlogisch.
ik heb die regel al aangepast. Dank je wel! Session start heeft daar niets mee te maken.
@Arjan:
Ik heb deze ook uitgeprobeerd met hetzelfde resultaat:
Code (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
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
class A
{
private $errors;
public function A ()
{
$this -> errors = array (0);
}
public function getErrors ()
{
return $this -> errors;
}
public function resetErrors ()
{
foreach ($this -> errors as $index => $error)
if ($index != 0)
unset ($this -> errors [$index]);
}
public function doSomeThing ()
{
B::doSomeThing ($this -> errors);
}
}
{
private $errors;
public function A ()
{
$this -> errors = array (0);
}
public function getErrors ()
{
return $this -> errors;
}
public function resetErrors ()
{
foreach ($this -> errors as $index => $error)
if ($index != 0)
unset ($this -> errors [$index]);
}
public function doSomeThing ()
{
B::doSomeThing ($this -> errors);
}
}
Maar deze heeft ook niet geholpen.
Dan krijg je juist een error dat de classe A niet gevonden kan worden.
Hij zet een A object in de sessie, dus bij session_start() moet die classe beschikbaar zijn, of een autoloader geregistreerd zijn die classe A kan vinden.
Dus tenzij je via een php.ini/.htaccess standaard een php bestand vooraf laat includen zal je session_start() niet als eerste aan kunnen roepen.
@M A
Je hebt wel telkens nadat je een verandering hebt aangemaakt even een keer $_SESSION = array(); aangeroepen of je PHPSESSID cookie verwijderd?
Met de code uit je openingspost, na een extra ')' op regel 7 van index.php toegevoegd te hebben, krijg ik braaf 'YES' te zien op mijn scherm.
PS. gebruik a.u.b. curly brackets ('{' & '}') bij if, for, while etc. statements!
Dos Moonen op 07/06/2011 23:15:42:
@Obelix en Idefix
Dan krijg je juist een error dat de classe A niet gevonden kan worden.
Hij zet een A object in de sessie, dus bij session_start() moet die classe beschikbaar zijn, of een autoloader geregistreerd zijn die classe A kan vinden.
Dus tenzij je via een php.ini/.htaccess standaard een php bestand vooraf laat includen zal je session_start() niet als eerste aan kunnen roepen.
@M A
Je hebt wel telkens nadat je een verandering hebt aangemaakt even een keer $_SESSION = array(); aangeroepen of je PHPSESSID cookie verwijderd?
Met de code uit je openingspost, na een extra ')' op regel 7 van index.php toegevoegd te hebben, krijg ik braaf 'YES' te zien op mijn scherm.
PS. gebruik a.u.b. curly brackets ('{' & '}') bij if, for, while etc. statements!
Dan krijg je juist een error dat de classe A niet gevonden kan worden.
Hij zet een A object in de sessie, dus bij session_start() moet die classe beschikbaar zijn, of een autoloader geregistreerd zijn die classe A kan vinden.
Dus tenzij je via een php.ini/.htaccess standaard een php bestand vooraf laat includen zal je session_start() niet als eerste aan kunnen roepen.
@M A
Je hebt wel telkens nadat je een verandering hebt aangemaakt even een keer $_SESSION = array(); aangeroepen of je PHPSESSID cookie verwijderd?
Met de code uit je openingspost, na een extra ')' op regel 7 van index.php toegevoegd te hebben, krijg ik braaf 'YES' te zien op mijn scherm.
PS. gebruik a.u.b. curly brackets ('{' & '}') bij if, for, while etc. statements!
@Dos Moonen:
Thanx! In de echte code had ik een header gebruikt waarna geen die stond. Dat was de boosdoener. Jouw reactie was een eyeopener.
Gewijzigd op 08/06/2011 00:18:19 door M A