[opgelost] geheugen??
Een raar verschijnsel. Ik heb een class die een "leesbare" versie van een variabele teruggeeft. Werkt prima. Echter, vandaag besloot ik een stukje code om te draaien waarvan je zou verwachten dat het geen verschil zou maken. Echter, dit resulteert in een dikke foutmelding:
Allowed memory size of 33554432 bytes exhausted (tried to allocate 49 bytes) in...
Dit was de originele code (versimpeld):
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
<?php
class Var {
private $variable;
public function __construct($variable) {
$this->variable = $variable;
}
public function __toString() {
return $this->getVar($this->variable);
}
private function getVar($variable) {
// bewerk $variable
// return een leesbare versie
}
}
// voorbeeldje:
$bar = new Foo();
$array = ['foo' => $bar, 'welkom' => 'Hallo allemaal!'];
echo new Var($array);
// bovenstaande toont een makkelijk leesbare versie van $array
?>
class Var {
private $variable;
public function __construct($variable) {
$this->variable = $variable;
}
public function __toString() {
return $this->getVar($this->variable);
}
private function getVar($variable) {
// bewerk $variable
// return een leesbare versie
}
}
// voorbeeldje:
$bar = new Foo();
$array = ['foo' => $bar, 'welkom' => 'Hallo allemaal!'];
echo new Var($array);
// bovenstaande toont een makkelijk leesbare versie van $array
?>
Nu heb ik een hele simpele aanpassing gemaakt. In plaats dat ik de variabele vanuit de method __toString() meegeef aan de method getVar() haal ik de method direct op in getVar(). Zie hier het verschil met de eerste versie.
Code (php)
Dit levert dus de eerder genoemde foutmelding op, maar ik heb geen idee waarom???? Weet iemand waar dit door komt?
Edit:
STOM STOM STOM...
Probleem is opgelost. De functie is recursief! Ik lag te slapen... opgelost dus!
Gewijzigd op 28/04/2013 21:16:29 door Ozzie PHP
Ik wil zoiets ook maken, maar dan ook de naam van de variabele tonen.
Dus iets als:
Dat moet iets geven als
Quote:
$naam
Inhoud: Eddy
Type: string
Lengte: 4 tekens
Inhoud: Eddy
Type: string
Lengte: 4 tekens
Dit alles is makkelijk, maar de naam van de variabele pakken.... hoe doe jij dat? Of heb jij dat ook niet?
Nee, helaas... dat heb ik ook niet. Ik heb daar destijds nog een topic over gestart. Er waren wel vage hacks om via backtrace een naam te achterhalen, maar volgens mij was dat niet waterdicht en ik vind het ook veel te ondoorzichtig. Uit een array of object kun je overigens wel de keys en properties halen.
Eddy E op 29/04/2013 08:48:47:
Dit alles is makkelijk, maar de naam van de variabele pakken.... hoe doe jij dat? Of heb jij dat ook niet?
Namen van variables zijn bijzaak. Voor een compiler tenminste; voor mensen zijn ze wel handig. Er zijn verschillende aspecten waardoor wat jij wilt eigenlijk niet mogelijk is:
1) De parser van een programmeertaal bouwt een symbol table op. Een variabele wordt gezien als een token met een pointer naar een element in die symbol table. Zodra de symbol table is opgebouwd, zijn de variabelenamen niet meer nodig; om geheugenruimte te besparen worden die -in principe- ook niet bijgehouden.
2) Als je een functie aanroept, wordt de waarde van je variabele op de call stack geplaatst ('call by value'). In de aangeroepen functie wordt een nieuwe variabele (ergo: een nieuwe entry in de symbol table) aangemaakt die de inhoud krijgt van datgene wat in de call stack staat. Die aangeroepen functie weet dus met geen mogelijkheid waar die data vandaan komt.
Als je bij je functie-aanroep de variabele 'by reference' meegeeft (in PHP met een &) dan wordt niet de waarde van de variabele op de call stack geplaatst, maar de pointer naar de symbol table. De aangeroepen functie werkt dan niet op een kopie van de data, maar op de data zelf. Omdat de naam van de variabele echter niet wordt bewaard, kun je die ook in dit geval niet opvragen.
Je zal dus bij de aanroep van je functie niet alleen de waarde van een variabele moeten meegeven, maar ook (in een extra parameter) diens naam.
De vraag blijft natuurlijk waarom de naam van een variabele die je aan een functie/methode meegeeft van belang is.
Dus als je zou zeggen var_dump($car_collection); dat er dan netjes boven komt te staan "Vardumping $car_collection:". Het is puur voor debug doeleinden dus.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$foo="bar";
vardump('foo');
function vardump($varname)
{
global ${$varname};
print "$varname: ${$varname}\n";
}
vardump('foo');
function vardump($varname)
{
global ${$varname};
print "$varname: ${$varname}\n";
}
maar om nou te zeggen dat dit getuigt van een goede programmeerstijl... ;-)
Toevoeging op 30/04/2013 10:20:10:
Ozzie PHP op 29/04/2013 22:30:38:
@Ger: gewoon als var_dump... als je iets var_dumpt dan is het handig om te zien WAT je var_dumpt.
Dus als je zou zeggen var_dump($car_collection); dat er dan netjes boven komt te staan "Vardumping $car_collection:". Het is puur voor debug doeleinden dus.
Dus als je zou zeggen var_dump($car_collection); dat er dan netjes boven komt te staan "Vardumping $car_collection:". Het is puur voor debug doeleinden dus.
Als je aan het debuggen bent, wil je vaak niet alleen weten wat de waarde van een variabele is, maar ook bijvoorbeeld het regelnummer. Je kan dan net zo goed op de plaats waar je je dump-routine aanroept eerst een echo doen met dit soort informatie.
Gewijzigd op 30/04/2013 10:14:12 door Willem vp