Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

PHP - Rare type conversie tussen objecten en arrays

Pagina: 1
Acties:

  • meneer william
  • Registratie: Maart 2011
  • Laatst online: 04-11-2024
Tijdens het dagelijkse rond kloten kwam ik iets tegen in PHP wat mij nogal verbaasde.

Allereerst maken wij een gewone array en vervolgens zetten wij die om naar een object daarna voegen wij aan dat object nieuwe waarden toe en daarna zetten wij het object weer om naar en array. Tussen elke stap gebruiken wij var_dump om de inhoud te zien van de array of het object.

PHP: test.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
<?php
  
  $array = array(
    1 => 'value1',
    '2' => 'value2',
    'fulltext' => 'value3'
  );
  
  echo '<pre>';


  var_dump($array);
  
  $object = (object)$array;
  
  var_dump($object);
  
  $object->{1} = 'Verandervalue1';
  $object->{'2'} = 'Verandervalue2';
  $object->fulltext = 'Verandervalue3';
  
  var_dump($object);
  
  $array = (array)$object;
  
  var_dump($array);
  
  echo '</pre>';
  
?>


Het resultaat is als volgt:
array(3) {
  [1]=>
  string(6) "value1"
  [2]=>
  string(6) "value2"
  ["fulltext"]=>
  string(6) "value3"
}

object(stdClass)#1 (3) {
  [1]=>
  string(6) "value1"
  [2]=>
  string(6) "value2"
  ["fulltext"]=>
  string(6) "value3"
}

object(stdClass)#1 (5) {
  [1]=>
  string(6) "value1"
  [2]=>
  string(6) "value2"
  ["fulltext"]=>
  string(14) "Verandervalue3"
  ["1"]=>
  string(14) "Verandervalue1"
  ["2"]=>
  string(14) "Verandervalue2"
}

array(5) {
  [1]=>
  string(6) "value1"
  [2]=>
  string(6) "value2"
  ["fulltext"]=>
  string(14) "Verandervalue3"
  ["1"]=>
  string(14) "Verandervalue1"
  ["2"]=>
  string(14) "Verandervalue2"
}

Als gevolg hiervan kun je waarden in een array die opgeslagen zijn met numerieke sleutel niet benaderen wanneer je deze omzet naar een object. Andersom ook niet.

Stel je voor je geeft één van je collega's via een klasse of functie een array terug met waarden die hij er niet kan uithalen. Hij gebruikt var_dump of print_r en kan ze wel zien maar niet benaderen.

Volgens nikic (één PHP core developer) komt dit omdat numerieke sleutels in een array in C uiteindelijk als getal worden beschouwd zelf al gebruik je deze syntax in php '1' => 'value'. Andersom worden numerieke sleutels in objecten altijd opgeslagen als strings.

[ Voor 0% gewijzigd door RobIII op 17-10-2013 17:15 . Reden: Output in [cmd] tags voor leesbaarheid ]

sirwilliam


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Je moet dit ook absoluut niet willen doen...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • mace
  • Registratie: Juni 2003
  • Laatst online: 21-11 19:01

mace

Sapere Aude

Welcome to PHP! :P

  • borft
  • Registratie: Januari 2002
  • Laatst online: 21-11 11:31
Jammer dat er geen like button is. Waarom zou je in godsnaam arrays naar objecten willen casten of andersom? ;)

  • Aionicus
  • Registratie: Februari 2011
  • Laatst online: 08-08-2023
borft schreef op donderdag 17 oktober 2013 @ 17:26:
Jammer dat er geen like button is. Waarom zou je in godsnaam arrays naar objecten willen casten of andersom? ;)
omdat het kan? :)

  • meneer william
  • Registratie: Maart 2011
  • Laatst online: 04-11-2024
NMe schreef op donderdag 17 oktober 2013 @ 17:24:
Je moet dit ook absoluut niet willen doen...
Niet mee eens. Er zijn mensen/bedrijven die liever met alleen objecten of array's werken. Het zou handig zijn als je een array instant om kan zetten naar een object of juist andersom. Het gevaarlijke is dan dat het in eerste instantie blijkt te werken (Met full text index wel) maar het plots toch en keerzijde heeft omdat je properties of array elementen hebt gecreëerd waar je vervolgens niet bij kan.

De syntax is wel correct alleen PHP handelt het niet goed af. Voor meer info zie: http://nikic.github.io/20...ntation.html#the_symtable

sirwilliam


  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

meneer william schreef op donderdag 17 oktober 2013 @ 19:09:
[...]


Niet mee eens. Er zijn mensen/bedrijven die liever met alleen objecten of array's werken. Het zou handig zijn als je een array instant om kan zetten naar een object of juist andersom. Het gevaarlijke is dan dat het in eerste instantie blijkt te werken (Met full text index wel) maar het plots toch en keerzijde heeft omdat je properties of array elementen hebt gecreëerd waar je vervolgens niet bij kan.

De syntax is wel correct alleen PHP handelt het niet goed af. Voor meer info zie: http://nikic.github.io/20...ntation.html#the_symtable
Als je alleen met objecten of arrays werkt is er geen probleem, het gaat mis bij de conversie van array naar object.

Daarnaast zou ik het hele vreemde bedrijven vinden als die als policy hebben 'alleen met objecten werken'.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

meneer william schreef op donderdag 17 oktober 2013 @ 19:09:
[...]

Niet mee eens. Er zijn mensen/bedrijven die liever met alleen objecten of array's werken. Het zou handig zijn als je een array instant om kan zetten naar een object of juist andersom. Het gevaarlijke is dan dat het in eerste instantie blijkt te werken (Met full text index wel) maar het plots toch en keerzijde heeft omdat je properties of array elementen hebt gecreëerd waar je vervolgens niet bij kan.
Er is weinig mis met het casten van associatieve arrays naar objecten. Daar is PHP op ingericht, werkt prima. Maar een array met numerieke indices casten naar een object is gewoon ranzig, en zoals je ziet is PHP er absoluut niet op ingericht. Dus: onder bepaalde omstandigheden kan het nuttig zijn om een array naar een object te casten of andersom. Maar een array met een numerieke index op die manier converten is in elk geval wat mij betreft een hele dikke no-no.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Alain
  • Registratie: Oktober 2002
  • Niet online
NMe schreef op donderdag 17 oktober 2013 @ 20:52:
Er is weinig mis met het casten van associatieve arrays naar objecten.
Ik ben geen PHP programmeur, maar ik vraag me af waarom dit zo is. Als je met objecten werkt, dan maak je toch een class die een array in kan lezen? (En foutmeldingen terug geeft als de array niet correct is)

You don't have to be crazy to do this job, but it helps ....


  • pedorus
  • Registratie: Januari 2008
  • Niet online
meneer william schreef op donderdag 17 oktober 2013 @ 19:09:
De syntax is wel correct alleen PHP handelt het niet goed af.
Het wordt volgens specs afgehandeld, dit is expres vanwege lagere performance die het casten anders zou hebben. :p Je kunt de variabelen ook benaderen door terug te casten, zie bijv. http://stackoverflow.com/...ys-as-string-cant-be-used

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Cartman!
  • Registratie: April 2000
  • Niet online
Dat gedrag hoort bij de taal die je gebruikt, nu je dat weet kun je dus gewoon een betere oplossing verzinnen. Meer kan ik er gewoon niet van maken.

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 15:03

Pizzalucht

Snotneus.

Als je vervolgens dit doet op het aangepaste object krijg je ook een leuk resultaat:

code:
1
2
3
foreach($object as $key => $val) {
  print $key . ': ' . $val . ', ' . $object->{$key} . "\n";
}

:+

En als je
code:
1
2
$array = get_object_vars($object);
var_dump($array);


Doet, krijg je ook een leuk resultaat :P

[ Voor 30% gewijzigd door Pizzalucht op 17-10-2013 22:18 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

AlainS schreef op donderdag 17 oktober 2013 @ 21:46:
[...]

Ik ben geen PHP programmeur, maar ik vraag me af waarom dit zo is. Als je met objecten werkt, dan maak je toch een class die een array in kan lezen? (En foutmeldingen terug geeft als de array niet correct is)
Waarom zou je? Een cast is relatief goedkoop dus als je een stukje standaardcode hebt dat toevallig een object verwacht terwijl je een array hebt, of als je toevallig een string replace wil doen met de keys en values van een object, dan is het domweg een stuk simpeler om een cast te doen. Onder water zijn arrays toch al bijna gelijk aan objecten. Je moet het absoluut niet te pas en te onpas gebruiken, maar er zijn toepassingen voor. Een numeriek geïndexeerde array is daar echter geen voorbeeld van.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • jessy100
  • Registratie: November 2010
  • Laatst online: 22-11 15:23
Ik vraag me echt af waarom iemand dit zou willen doet. Een array is in php (bijna) gelijk aan een object. Dit is naar mijn mening gewoon lelijke, onnodige code.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

En toch heb ik het één of twee keer goed kunnen gebruiken. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
meneer william schreef op donderdag 17 oktober 2013 @ 19:09:
[...]

Niet mee eens. Er zijn mensen/bedrijven die liever met alleen objecten of array's werken.
Zulke mensen moeten gewoon putjesschepper worden en niet gaan zitten programmeren...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Een bedrijf dat zegt dat arrays goed zijn en objecten niet of andersom is inderdaad niet goed wijs.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Rubix
  • Registratie: Juli 2004
  • Laatst online: 26-09-2022
meneer william schreef op donderdag 17 oktober 2013 @ 19:09:
[...]


Niet mee eens. Er zijn mensen/bedrijven die liever met alleen objecten of array's werken. Het zou handig zijn als je een array instant om kan zetten naar een object of juist andersom. Het gevaarlijke is dan dat het in eerste instantie blijkt te werken (Met full text index wel) maar het plots toch en keerzijde heeft omdat je properties of array elementen hebt gecreëerd waar je vervolgens niet bij kan.
Er is geen fatsoenlijk bedrijf dat liever met het één óf het ander werkt, omdat het twee totaal verschillende zaken zijn.

Dat is ook de reden dat er geen zinnige conversie te maken is.
Pagina: 1