[PHP] Return van informatie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Iets wat ik mij al een tijdje afvraag ;)

Waarom wordt er in PHP altijd gereturnd dmv. van arrays (die strings als keys kunnen hebben, dus een soort stl map<string, string> uit C++ - maar dan ook op willekeurige plaatsen een map in een map), en niet dmv. van 'structs', zoals het volgens mij eigenlijk hoort?

Een voorbeeldje:

Stel je hebt een persoon met volgende gegevens: naam, voornaam, adres, en lijst van favoriet eten.
In C++/Java zou je toch een struct/class aanmaken:

code:
1
2
3
4
5
6
class Persoon
{
     std::string m_voorNaam;
     std::string m_achterNaam;
     std::vector<string> m_favorietEten;
}
En dus ook een functie die zo'n object returnt:

code:
1
Persoon getPersoon(int persoonId);
Waarom doet bijna niemand dat in PHP (ik heb al aardig wat bestaande scripts bekeken, nog nooit tegengekomen). Daar returnt men gewoon een array, met volgende structuur:

code:
1
2
3
4
5
6
7
8
9
10
array
(
     ['voorNaam'] = "DiEana"
     ['achterNaam'] = "anaEiD"
     ['favorietEten'] = array
          (
               [0] = "Lasagna"
               [1] = "Fritteeeeeeeeeeuh"
          )
)
Is dat puur omv. snelheidsoverwegingen (primitieve types sneller dan zelf-gedefinieerde objecten), of zijn er andere redenen voor?

Thanks ;)

Acties:
  • 0 Henk 'm!

  • cybermans
  • Registratie: Maart 2001
  • Laatst online: 17-09 09:56
ik denk dat het vooral met luiheid te maken heeft. En PHP is nog niet bepaald volledig OO (geen zin in een flamewar hierover want geen interfaces zegt toch al genoeg)

Strava | Runkeeper | Endomondo (mijn leikr uploads)


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

PHP is sneller met een on-the-fly gemaakte array, dan een geinstantieerd object. Dus.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruik liever multidimensional arrays dan classes, het gaat toch bijna om hetzelfde principe, en persoonlijk vind ik het mooier dan voor elke variabele die wat meer info met zich meedraagt een class aan te gaan maken...

Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Verwijderd schreef op 23 June 2003 @ 10:28:
Ik gebruik liever multidimensional arrays dan classes, het gaat toch bijna om hetzelfde principe, en persoonlijk vind ik het mooier dan voor elke variabele die wat meer info met zich meedraagt een class aan te gaan maken...
Als het enkel om een groepje variabelen gaat ben ik dat op zich wel met je eens (al zal het er vanaf hangen denk ik in wat voor talen je verder nog ontwikkeld... als je verder veel met java doet zal de keuze om classes te maken misschien weer wat eenvoudiger zijn), maar als het meer is dan alleen wat variabelen (bv ook routines om de persoon uit de database te trekken, of desnoods een "aanspreektitel" op te bouwen) is een class denk ik wel netter.
Maar ik kan voorstellen dat een array sneller is dan classes, en dan zal dat de reden zijn :)

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Hangt nogal van de complexiteit af.. Als het alleen een verzameling gegevens is dan simpel en snel met een Array, anders definieer ik er wel een speciale class voor. Das vooral handig als je de output op meerdere plekken /meerdere functies wilt gebruiken.

[ Voor 22% gewijzigd door Bosmonster op 23-06-2003 10:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

@ Crazy D: Dat ben ik met je eens :) als er speciale functies aangemaakt moeten worden die alleen iets met 1 variabele te maken hebben, maar ik ook een class aan...

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Nog een reden om een array boven een object te verkiezen is de mogelijkheid om hem op te slaan in een session. Een object kan je hier niet in opslaan. (het lukt mij niet althans)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ik denk dat het vooral te maken heeft met de loose typing. Php scripters zijn niet gewend om aan types te denken bij hun variabelen. Dat is ook heel goed te zien aan al dat gebruik van "$var" ipv $var en af en toe het gebrek aan inzien dat een getal verschilt van een stukje tekst.

Juist voor scheiding van presentatie en datalaag is het gebruik van classes veel handiger. Mijn forum (tja, wie heeft er niet een) maakt ook gebruik van classes. Een vriend van mij die dit forum in zijn producten verkocht hoefde alleen de layout te maken en binnen een kwartier had hij of ik de functionaliteit ( <?php=message.getTitle() ?>) erin gehangen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Michali schreef op 23 June 2003 @ 11:05:
Nog een reden om een array boven een object te verkiezen is de mogelijkheid om hem op te slaan in een session. Een object kan je hier niet in opslaan. (het lukt mij niet althans)
en, maak je gewoon een 'store in session' methode, bij de constructor kun je vervolgens iets aangevan dat ie 'm uit de session moet initialiseren en het werkt perfect.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Janoz schreef op 23 June 2003 @ 11:14:
en, maak je gewoon een 'store in session' methode, bij de constructor kun je vervolgens iets aangevan dat ie 'm uit de session moet initialiseren en het werkt perfect.
Ik kon altijd gewoon:
$_SESSION['object'] = $object;


doen en later
$object = $_SESSION['object'];

Je moet er natuurlijk wel voor zorgen dat de definitie van het object al bekend is voor je hem terughaalt uit je sessie en je moet niet verwachten dat je mysql-connectid's nog bestaan enzo :o

Wat ik trouwens nog steeds niet snap is het eeuwige gebazel over "het is sneller". Tuurlijk is het sneller, maar ook minder handig en minder onderhoudbaar, imho.

En met de snelheid van de gemiddelde server en de 'lage' bezoekersaantallen van de gemiddelde website boeit die paar milliseconden performanceverschil volgens mij echt totaal niet.

[ Voor 24% gewijzigd door ACM op 23-06-2003 12:18 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, dat is duidelijk mensen, thanks ;)

Ik denk het dus ook op de C++ manier te doen, dus werken met classes & instanties ervan returnen.

Op dit moment zie ik daar nog 1 groot nadeel aan, afgezien de snelheid (zo veel trager kan dat toch niet zijn, denk ik): in al die template 'engines' (smarty, pear en phplib), moet je waarden assignen dmv. van arrays, en niet objecten, die je op zijn beurt opnieuw gaat doorlopen in de template files. Je kan geen objecten assignen, of zie ik dat verkeerd?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

In php's eigen functies kan je dat vaak zo doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
class myclass {
  function say_hello() {
    print "Hello!\n";
  }
}

$classname = "myclass";

call_user_func(array($classname,'say_hello'));
?>

(bron: http://www.php.net/manual/en/function.call-user-func.php)

Dus afhankelijk van de interne werking van zo'n template kan je er misschien nog wel mee wegkomen met een object :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op 23 June 2003 @ 12:22:
...

http://www.php.net/manual/en/function.call-user-func.php

Dus afhankelijk van de interne werking van zo'n template kan je er misschien nog wel mee wegkomen met een object :)
Dat is inderdaad een manier, maar volgens mij veel te omslachtig. En daarbij is het zoiezo niet de bedoeling om php functies op te roepen in je template files, hoewel dat perfect mogelijk is ;)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nee, ik bedoel dat als die template-engines ZO de functies aanroepen, dan is het voor jou heel simpel dat te gebruiken :)

Magoed, je kan altijd nog een objectToTemplate() functie definieren dat jij intern lekker met objecten werkt en de templates gewoon alleen de zinvolle parameters krijgen op het moment dat dat nodig is :)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

ACM schreef op 23 June 2003 @ 12:15:
Wat ik trouwens nog steeds niet snap is het eeuwige gebazel over "het is sneller". Tuurlijk is het sneller, maar ook minder handig en minder onderhoudbaar, imho.

En met de snelheid van de gemiddelde server en de 'lage' bezoekersaantallen van de gemiddelde website boeit die paar milliseconden performanceverschil volgens mij echt totaal niet.
Een nieuwe/extra proc/geheugenbankje/server is een stuk goedkoper dan een goede programmeur extra aan snelle, maar ononderhoudbare code te laten werken!

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1