__toString() method werkt niet
Code (php)
Alleen werkt de toString method niet. Als ik het volgende doe:
Nu verwacht ik eigenlijk dat te print_r een array toont $data alleen nu toont hij de Json object. Kan iemand mij vertellen wat ik verkeerd doe? Ik heb PHP versie 5.3.8
probeer:
Je code is trouwens verwarrend. Je stop een object, in dit geval een instantie van de class Json in een variabele $class. Dit zou netter zijn:
print_r verwacht een array of object.
__tostring wordt pas geactiveerd wanneer je probeert een echo of print van een object uit te voeren; dus met print_r voelt de class zich niet aangesproken om __tostring te triggeren.
En sowieso, __tostring() wordt geacht een string terug te geven; het kan dus nooit de bedoeling zijn dat je een array return't.
Dit kan wel:
Mijn volgende vraag is, ik het dus een Json Class. Die haalt een Json bestand op en leest deze uit. Momenteel gebruik ik de class als volgt:
Zoals je kunt zien haal ik via $json->getData de geparsede json op, ik heb liever dat dit ik 1 keer gebeurd en dus niet de $json->getData hoef uit te voeren, dus ik wil het graag zo:
Dus dat Json class gelijk de geparsede json terug geeft ipv oject.
En heb liever dit:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$config = new Config(new Json(URL_JSON_BESTAND));
$config = new Config(new Xml(URL_XML_BESTAND));
?>
$config = new Config(new Json(URL_JSON_BESTAND));
$config = new Config(new Xml(URL_XML_BESTAND));
?>
ipv:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$json = new Json(URL_JSON_BESTAND);
$config = new Config($json->getData);
$xml = new Xml(URL_XML_BESTAND);
$config = new Config($xml->getData);
?>
$json = new Json(URL_JSON_BESTAND);
$config = new Config($json->getData);
$xml = new Xml(URL_XML_BESTAND);
$config = new Config($xml->getData);
?>
Is dit mogelijk?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface DataInterface {
function getData();
}
class JSON implements DataInterface {
function getData() {
// return je data
}
}
class Config {
function __construct(DataInterface $data) {
$this->data = $data->getData();
}
}
function getData();
}
class JSON implements DataInterface {
function getData() {
// return je data
}
}
class Config {
function __construct(DataInterface $data) {
$this->data = $data->getData();
}
}
Nu kun je dus makkelijk een XML bestand inladen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
class XML implements DataInterface {
function getData() {
// return je data
}
}
$xml = new XML(URL_XML_BESTAND);
$config = new Config($xml);
function getData() {
// return je data
}
}
$xml = new XML(URL_XML_BESTAND);
$config = new Config($xml);
Gewijzigd op 17/12/2012 14:11:59 door Moose -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
switch(strtoupper($driver)) {
case 'INI':
$reader = new Reader\Ini($parameters);
$this->catalogue->setData($reader->getData());
break;
case 'JSON':
$reader = new Reader\Json($parameters);
$this->catalogue->setData($reader->getData());
break;
case 'XML':
$reader = new Reader\Xml($parameters);
$this->catalogue->setData($reader->getData());
break;
default:
throw new Exception\RuntimeException(sprintf('Failed to initialize %s, there is no driver avaible for "%s".', __CLASS__, $driver));
break;
}
?>
switch(strtoupper($driver)) {
case 'INI':
$reader = new Reader\Ini($parameters);
$this->catalogue->setData($reader->getData());
break;
case 'JSON':
$reader = new Reader\Json($parameters);
$this->catalogue->setData($reader->getData());
break;
case 'XML':
$reader = new Reader\Xml($parameters);
$this->catalogue->setData($reader->getData());
break;
default:
throw new Exception\RuntimeException(sprintf('Failed to initialize %s, there is no driver avaible for "%s".', __CLASS__, $driver));
break;
}
?>
Gewijzigd op 17/12/2012 12:07:29 door Moose -
Eigenlijk zou ik de regel $this->catalogue->setData($reader->getData()); uit de switch moeten halen en die er onder moeten zetten. :-)
precies :) Dan is het makkelijk uit te breiden zonder dat je wat hoeft toe te voegen aan je Config class
Wat ik zou doen is de methode die ze bij Zend gebruiken. Je hebt Parser klassen zoveel als je wilt (ze noemen dit Reader) en ze hebben een Config klasse. Deze Config klasse krijgt als constructor gewoon een array met de configuratie mee, hoe je die hebt gekregen (met parsers of gewoon een normale PHP array) maakt die config klasse niet uit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
use Zend\Config\Config;
// ini configuratie
$config = new Config(new \Zend\Config\Reader\Ini(INI_CONFIG_FILE));
// yaml configuratie
$config = new Config(new \Zend\Config\Reader\Yaml(YAML_CONFIG_FILE));
// ... ect.
// of gewoon een php configuratie
$config = new Config(array('framework' => array('foo' => 'bar', 'lorem' => 'ipsum')));
?>
use Zend\Config\Config;
// ini configuratie
$config = new Config(new \Zend\Config\Reader\Ini(INI_CONFIG_FILE));
// yaml configuratie
$config = new Config(new \Zend\Config\Reader\Yaml(YAML_CONFIG_FILE));
// ... ect.
// of gewoon een php configuratie
$config = new Config(array('framework' => array('foo' => 'bar', 'lorem' => 'ipsum')));
?>
Als jij in je YAMLParser een getData functie maakt en daarbinnen je array retourneert, hoef je toch niks aan je Config class aan te passen?
In het geval van Hertog zou je dan toch een 'Failed to initialize Config, there is no driver avaible for "YAML".' foutmelding krijgen?
Wacht, ik heb het alleen maar over de data verkrijgen en die array in een $data variable zetten binnen je Config class. Dan kan dat hele switch statement weg. Is de Reader\JSON class wat anders dan de JSON class?
Ik heb nu de onderstaande code, is dit een beetje goede OOP, zijn er nog tips/opmerkingen?
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
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
<?php
if (null === $driver || (!is_object($driver) && !is_string($driver))) {
throw new Exception\InvalidArgumentException(sprintf('Failed to initialize %s, driver object is not set.', __CLASS__));
} else if (is_object($driver)) {
if (!$driver instanceof Reader\ReaderInterface) {
throw new Exception\InvalidArgumentException(sprintf('Failed to initialize %s, driver object is not a valid reader.', __CLASS__));
} else {
$this->catalogue->setData($driver->getData());
}
} else if (is_string($driver)) {
switch(strtoupper($driver)) {
case 'INI':
$driver = new Reader\Ini($parameters);
break;
case 'JSON':
$driver = new Reader\Json($parameters);
break;
case 'XML':
$driver = new Reader\Xml($parameters);
break;
default:
throw new Exception\RuntimeException(sprintf('Failed to initialize %s, there is no driver avaible for "%s".', __CLASS__, $driver));
break;
}
$this->catalogue->setData($driver->getData());
}
?>
if (null === $driver || (!is_object($driver) && !is_string($driver))) {
throw new Exception\InvalidArgumentException(sprintf('Failed to initialize %s, driver object is not set.', __CLASS__));
} else if (is_object($driver)) {
if (!$driver instanceof Reader\ReaderInterface) {
throw new Exception\InvalidArgumentException(sprintf('Failed to initialize %s, driver object is not a valid reader.', __CLASS__));
} else {
$this->catalogue->setData($driver->getData());
}
} else if (is_string($driver)) {
switch(strtoupper($driver)) {
case 'INI':
$driver = new Reader\Ini($parameters);
break;
case 'JSON':
$driver = new Reader\Json($parameters);
break;
case 'XML':
$driver = new Reader\Xml($parameters);
break;
default:
throw new Exception\RuntimeException(sprintf('Failed to initialize %s, there is no driver avaible for "%s".', __CLASS__, $driver));
break;
}
$this->catalogue->setData($driver->getData());
}
?>
Gewijzigd op 18/12/2012 11:24:47 door Joakim Broden