Hoi,

Ik heb 2 vraagjes over JSON en objecten.

Ik heb een JSON bestand, dat kan ik in php gebruiken als object.

 $oMyObject = json_decode($json);


Maar voor OOP zou ik functies moeten kunnen toevoegen aan het object. Daarvoor moet je een class aanmaken begrijp ik. Maar kan ik mijn $oMyObject ook aan een class koppelen? Zo ja, hoe?

Tweede vraag:
Is het ook mogelijk, ik kan me niet voorstellen dat het niet kan ;-) , om vanuit een formulier waarden retour te sturen, bijvoorbeeld door het opsturen van een JSON? Zo ja, hoe zou ik dat moeten doen?
Volgens mij is JSON geen standaard-class in PHP, dus kan je deze niet extenden. Je kan uiteraard wel je eigen JSON-functies schrijven. Het feit dat het met objecten werkt, hoeft niet per sé te betekenen dat het zelf meteen OO is.

Je tweede vraag snap ik niet echt. Kan je een voorbeeld geven?
Misschien is het handig om eerst eens te vertellen wat je precies wilt.
json_decode maakt automatisch een object. Wanneer je hier 'true' aan toevoegt krijg je een array.

Misschien heb je hier iets aan?
JSON is en blijft data en is geen object. Je kunt wel een object (class) schrijven welke de JSON data verwerkt.
Persoonlijk snap ik dan ook niet zo goed waarom de PHP developers gekozen hebben voor de constructie om de JSON standaard te verwerken naar een "standaard PHP object". Ik gebruik dan ook altijd zoals Michael ook aangeeft de optie om de data als associatieve array binnen te halen door als tweede parameter TRUE op te geven.

Ik maak zelf vaak een fromArray() en toArray() method in een class als ik data van een array naar een object wil kopiëren of visa versa
Dank jullie voor jullie reacties. Ik ben er weer wat verder mee wat betreft gedachtevorming. Maar somige dingen roepen wel wat vragen op.

@Ariën: Kan het zijn dat je bedoelde te schrijven dat je uit json_decode juist wel een stdClass object krijgt en dat die niet uit te bereiden is? Ik haal tenminste uit de documentatiedocumentatie dat het naar een stdClass object wordt omgezet.

@Michael: dank je voor de links, ik kende ze, maar ik kan nog niet de verbinding maken met als ik data heb in objectvorm (json) en daar een "echt" object van te maken. Wat ik feitelijk wil is dat ik onderzoek hoe OOP nu precies werkt en hoe ik het praktisch kan toepassen. Maar aangezien ik een hobbyist en geen echte programmeur ben, is het soms moeilijk grip te krijgen op mijn gedachten en de mogelijkheden en wat ik nu precies wil. En probeer ik soms iets te veel iets perfect te programmeren terwijl er vaak meerdere wegen zijn die naar Rome leiden. Indien nodig probeer ik het wel verder te verduidelijken, maar ik denk dat ik met de huidige reacties al aardig op weg ben.

@Frank: Dank je voor je duidelijke en heldere uiteenzetting. Ik denk dat je gelijk hebt en dat ik de json beter als array kan zien en de data in een echt object moet inlezen. Heb je een voorbeeld van die fromArray() en toArray() methoden bij de hand? Ik kan me voorstellen dat het gewoon een loop wordt of is er iets snellers? Ik neem aan dat dat object weer als json weg te schrijven is?

Ten aanzien van mijn andere vraag, zijn er andere methoden om informatie uit een form via POST terug te sturen naar de server? Of moet het gekoppeld zijn aan een <input> tag?

<?php

class Child {
protected $name;

public function getName() {
return $this->name;
}

public function setName($name) {
$this->name = $name;
}

public function toArray() {
return [
'name' => $this->name
];
}

public function fromArray(array $array) {
$this->name = $array['name'];
}
}

class Test {
protected $childs;

public function __construct() {
$this->childs = [];
}

public function addChild(Child $child) {
$this->childs[] = $child;
}

public function toArray() {
$childs = [];

foreach($this->childs as $child) {
$childs[] = $child->toArray();
}

return [
'childs' => $childs
];
}

public function fromArray(array $array) {
$this->childs = [];

foreach($array['childs'] as $child) {
$object = new Child();

$object->setName($child['name']);

$this->addChild($object);
}
}
}

$test = new Test();

$c = new Child();
$c->setName('child1');
$test->addChild($c);

$c = new Child();
$c->setName('child2');
$test->addChild($c);

$json = json_encode($test->toArray());

echo $json; // {"childs":[{"name":"child1"},{"name":"child2"}]}

$test->fromArray(json_decode($json, true));

print_r($test);
?>

>> Ten aanzien van mijn andere vraag, zijn er andere methoden om informatie uit een form via POST terug te sturen naar de server? Of moet het gekoppeld zijn aan een <input> tag?

Met AJAX kun je zelf de post data samenstellen (al dan niet uit een formulier) en anders wordt het een <input type="hidden" name="myName" value="hidden value">
@ Frank: dank je wel voor het voorbeeld. Ik moet het nog goed bestuderen hoe het precies werkt, maar ik in eerste aanleg begrijp ik het.

Heb je misschien ook een voorbeeld hoe ik met AJAX iets terug stuur en het op vang met php? Mag ook een goede verwijzing zijn naar een tutorial of zo hoor?

[size=xsmall]Toevoeging op 16/01/2020 15:59:19:[/size]

Nog een andere vraag. Ik heb een aantal items, bijvoorbeeld 50, genummerd van 1 t/m 50. Dus Item1, Item2 ... Item50. De items zijn verdeeld over een aantal categorieën, bijvoorbeeld 5, cat1, cat2 ... cat5. Maar niet bij elke categorie zitten evenveel items:
voorbeeld:
cat1: item1 ... item12
cat2: item12 ... item18
cat3: item18 ... item32
etc.

Elk item kan 3 waarden hebben, 0, 1 of 2. Elke categorie kan ook en aantal waarden hebben, zoals een naam.

Ik wil in mijn html deel de items per categorie kunnen laten zien.

Voor mijn gevoel is het het handigste om de items onder de categorie onder te brengen, maar ik kan me ook voorstellen dat andersom misschien handiger kan zijn.

In een pure database zou ik 3 tabellen maken, een tabel met categorien, een tabel met items en een tabel die een item id aan een categorie id koppelt. Hoe zou ik dat met objecten moeten zien? Of denk ik nu te puriteins?
Het kan aan mij liggen hoor, maar ik kan je niet goed volgen.
Je hebt het over json, objects, data naar een server? Dus gewoon opslaan?, database normalisatie, categorisatie?
Al die deze dingen hoeven geen verband met elkaar te hebben.
Misschien is het handig om te uitleggen wat je precies wilt bereiken.

"Voor mijn gevoel is het het handigste om de items onder de categorie onder te brengen, maar ik kan me ook voorstellen dat andersom misschien handiger kan zijn."
Hoe jij het wilt weergeven is helemaal aan jou. Maar zoals je de tabellen schetst zou dat in ieder geval prima kunnen.
Als een item altijd alleen maar 0, 1 of 2 bevat hoef je daar natuurlijk geen tabel voor te maken, behalve als dat makkelijker is.
>> Heb je misschien ook een voorbeeld hoe ik met AJAX iets terug stuur en het op vang met php? Mag ook een goede verwijzing zijn naar een tutorial of zo hoor?

Ik werk zelf met JQuery. Ik weet niet of je hier enigszins bekend mee bent?


$.ajax({
  url: "test.php",
  method: "post",
  data: {"var1":"value1","var2":"value2"}
}).done(function(data) {
  alert(data);
});


>> In een pure database zou ik 3 tabellen maken, een tabel met categorien, een tabel met items en een tabel die een item id aan een categorie id koppelt. Hoe zou ik dat met objecten moeten zien?

Dan maak je een ManyToMany relatie tussen producten en categorieën. Dit betekend dat een categorie meerdere producten kan bevatten maar ook dat een product in meerdere categorieën kan worden ingedeeld.

En dus kun je eigenlijk een beetje mijn Test class overnemen welke een array heeft naar een andere class (in mijn voorbeeld Child). Alleen zouden beiden classen dan een array kunnen hebben. Namelijk:

een class Categorie welke een array heeft met Product classes
een class Product welke een array heeft naar Categorie classes

Vervolgens hangt het van je weergave af wat de Hoofdclass wordt. Wil je
cat1: item1 ... item12
cat2: item12 ... item18
cat3: item18 ... item32

laten zien dan pak je een array van Category classes waarin je elke Category class vult met een array van Product classes. In je view hoef je dan alleen maar iets te doen als:
<?php
foreach($categories as $category) {
echo '<h1>' . $category->getName() . '</h1>';

echo '<ul>';
foreach($category->getProducts() as $product) {
echo '<li>' . $product->getName() . '</li>';
}
echo '</ul>';
}
?>
Beste Frank,

Dank je voor je heldere uitleg.

JQuery ken ik alleen van naam en AJAX vooral als voetbalclub, dus ik denk dat ik wat dat betreft iets minder ambieus moet gaan zijn op dit moment en het met een hidden input ga doen.

Nog even terug naar je eerdere voorbeeld:
op regel 32 staat:
    public function addChild(Child $child) {

Betekent de (Child $child) dat de de opgeroepen variabele $child van het type class Child is? Net als dat op regel 20 en 48 de variabele $array van het type array is? Of heeft het een andere betekenis? Wat is de reden dat dat specifiek genoemd moet worden, want op regel 10 geef je niet aan dat het om een string gaat?

We noemen dat Type-hinting. Type hinting is optioneel maar zorgt er wel voor dat er een foutmelding gegeven wordt zodra er een ander type variabele meegegeven wordt in plaats van het type dat gevraagd wordt. Het maakt ook voor de programmeur direct duidelijk wat er verwacht wordt.

Reageren