login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Verschil C#.NET en PHP

Offline nemesiskoen - 28/03/2008 17:29 (laatste wijziging 07/11/2008 00:30)
Avatar van nemesiskoenGouden medaille

PHP expert
Hallo hallo

idee
dit topic is bedoeld als een deftig discussiepunt, waar het de bedoeling is zo serieus mogelijk te blijven. Grappige sarcastische opmerkingen horen thuis in ontspanning (bv. bij dat fitna topic kan wat gespot en gelachen worden). Hier liever niet. Liefst ook geen replies van telkens één zin, bewerk gewoon je vorig bericht als je maar 1 lijntje wil toevoegen. Laten we vooral beleefd blijven en zo open mogelijk staan.

uitgangspunt
Waar ik van uit wil gaan is het volgende: het grote verschil tussen C#.NET en PHP, en waarom beide door hun programmeursopgehemeld worden.
Voor de Ruby freaks: u bent welkom om me aan te vullen:-) ik kan geen Ruby schrijven, ik kan het wel lezen en verstaan maar ik ken de syntax niet uit m'n hoofd en de tools ook niet. Dus als er bij de puntjes iets is wat in Ruby ook zou uitblinken: feel free dit te vermelden!

mijn ervaring
Ik ben volgens mij één van de weinige (hier op sitemasters...) die beide talen goed beheerst. Van PHP durf ik te zeggen dat ik hier een krak in ben (of misschien was, zie verder). C#.NET heb ik stevig onder controle, en ik begrijp het object-model (dat zoveel keer uitgebreider is dan dat van PHP) maar al te goed.

Ik moet toegeven dat ik het laatste jaar slechts 1 klein systeempje heb geschreven in PHP, aangezien ik met andere zaken bezig was. Ik beheers de taal nog altijd heel goed, ken de syntaxis nog altijd, maar het kan altijd voorkomen dat ik bij mijn codevoorbeelden foutjes type.
Hetzelfde geld natuurlijk ook voor C#.NET.

VB.NET?
Waarom laat ik VB.NET achterwegen?
Heel eenvoudig omdat ik slechts geringe ervaring met VB.NET heb. Ik heb het 2 jaar geleden enkele keren gebruikt, maar heb me er niet volledig in verdiept.

Eerst zal ik twee voorbeelden aanhalen uit het verschil in de OO-engine van C# en PHP, daarna volgt een kleine opsomming uit enkele handigheden in ASP.NET (met C#). Aangezien de meerderheid (die op dit topic zal reageren) wel ervaring heeft met een MVC framework in PHP hoef ik dit volgens mij niet toe te lichten. Als er zaken zijn die je wil weten of dit in ASP.NET gaat dan vraag je maar raak en dan zal ik even toelichten of het gaat en hoe dan wel moet of niet (ik hoop dat titjes en ZG1988 mij hier ook bij zullen helpen, aangezien die 2 ook wel wat .NET achter de kiezen hebben).

VERSCHIL IN OO
GENERIC CLASSES
Generic classes in C#
Iets wat helemaal niet bestaat in PHP. Heel eenvoudigweg omdat PHP geen types kent zoals 'int', 'string', e.a. Maar toch zou het op zijn plaats zijn in PHP aangezien er wel typehinting bestaat.
Hoe ziet dit er in C#.NET uit:

  1. // CollectionClass is een generic class die zogezegd al bestaat
  2. CollectionClass<string> stringCollectie = new CollectionClass<string>();
  3. stringCollectie.Fill("SELECT naam FROM user");
  4. // doe iets met je strinCollectie


Wat hier gebeurt is eenvoudig: er wordt een klasse van het type CollectionClass aangemaakt en deze bevat een hoop items van het type string. Op zich niet veel speciaals, op het eerse zicht zou je zelfs die <string> kunnen weglaten omdat het niet echt nodig is, pas wanneer je die items terug gaat ophalen komt de kracht naarboven.
Laat ik eerst een voorbeeld demonstreren met een Collection-klasse die een hoop forum topics bevat (van het type Forum_Topic). Forum_Topic heeft een property Replies die alle replies terugstuurt.
  1. Model_Collection topics = new Model_Collection();
  2. topic.Fill("SELECT * FROM forum_topic WHERE category_id = @1", typeof(Forum_Topic), _id);


Hieronder laat ik Model_Collection zien zodat je een beetje een idee hebt hoe dit werk:
  1. public class Model_Collection : CollectionBase
  2. {
  3.  
  4. public Model_Collection(){ }
  5.  
  6. public void Add(Model m)
  7. {
  8. InnerList.Add(m);
  9. }
  10.  
  11. public Model this[int index]
  12. {
  13. get { return (Model)InnerList[index]; }
  14. set { InnerList.Insert(index, value); }
  15. }
  16.  
  17. public Model_Collection Fill(string query, Type t, params object[] parameterset)
  18. {
  19. // logic here
  20. return this;
  21. }
  22. }


Bij het toevoegen van een Model wordt gecast naar het type Model, bij het lezen ervan hetzelfde. Het probleem is als je nu die property Replies wilt aanroepen dat je een error krijgt (iets wat bij PHP nooit het geval zou zijn aangezien PHP dit allemaal toelaat):
  1. aDataGrid.DataSource = topics[0].Replies;

Geeft een error omdat topics[0] van het type Model is en niet van het type Forum_Topic.
Daarom met je casten:
  1. aDataGrid.DataSource = ((Forum_Topic)topics[0]).Replies;

Dit werkt wel maar je ziet dat dit gewoon lelijk is.
Je ziet ook dat bij Fill het type moet meegegeven worden, iets wat eigenlijk overbodig moet zijn.

Daarom bestaan er dus generic classes, die casten automatisch:
  1. Model_Collection<Forum_Topic> topics = new Model_Collection<Forum_Topic>();
  2. topics.Fil("SELECT * FROM forum_topic WHERE category_id = @1", _id);
  3. aDataGrid.DataSource = topics[0].Replies;


En de klasse Model_Collection ziet er dan zo uit:
  1. public class Model_Collection<T> : CollectionBase where T : Model
  2. {
  3.  
  4. public Model_Collection(){ }
  5.  
  6. public void Add(T m)
  7. {
  8. InnerList.Add(m);
  9. }
  10.  
  11. public T this[int index]
  12. {
  13. get { return (T)InnerList[index]; }
  14. set { InnerList.Insert(index, value); }
  15. }
  16.  
  17. public Model_Collection<T> Fill(string query, params object[] parameterset)
  18. {
  19. // logic here
  20. return this;
  21. }
  22. }


Meer info:
http://msdn2.microsoft.com/en-us/library/twcad0zb(VS.80).aspx
https://researc...nerics.pdf
http://msdn2.microsoft.com/nl-nl/magazine/cc164094(en-us).aspx
http://msdn2.microsoft.com/nl-nl/magazine/cc164081(en-us).aspx
http://codeplex...enericsnet

Generic Classes in PHP
Het bestaat niet, maar zo zou het er kunnen uitzien:
  1. <?php
  2. class Model_Collection<T> extends CollectionBase where T extends Model
  3. {
  4. public Add(T $m)
  5. {
  6. $this->_innerList->add($m);
  7. }
  8.  
  9. // de logic van this[int index] bestaat ook niet in php
  10.  
  11. public fill($query, $parameters)
  12. {
  13. // logic here
  14. return this;
  15. }
  16. }
  17.  
  18. $topics = new Model_Collection<Forum_Topic>();
  19. $topics->fill("SELECT * FROM forum_topic WHERE category_id = @1", $_id);
  20. var_dump($topics->GetReplies());


Natuurlijk is dit allemaal niet nodig in PHP omdat PHP hier niet naar kijkt, en gewoon die functie zal aanroepen op het object, welk type het ook moge zijn. Dus leuk en proper zou het wel zijn, maar echt nuttig niet.

http://blog.maa...n-PHP.aspx

POLYMORFISME
Polymorfisme: Virtual en Override in C#

Weer een voorbeeldje om te laten zien wat er fout kan lopen:
stel ik heb een hoop models, en die hebben allemaal een functie save. Daarnaast heb ik een klasse Model_Save_Handler met 1 statische functie Handle. Deze accepteert een argument van het type Model, en zal de methode Save aanroepen (en daarna nog allerlei zaken afhandelen die hier niet van belang zijn. Dan krijg je ongv zoiets:
  1. public class Model_Save_Handler
  2. {
  3. public static int Handle(Model m)
  4. {
  5. int insertId = m.Save;
  6. _logicFunction1();
  7. _logicFunction2();
  8. // etc...
  9. return insertId;
  10. }
  11. // veel statische private functies die de logic afhandelen
  12. }


Als ons Model er zo uitziet:
  1. public class Model
  2. {
  3. }


En onze subklassen:
  1. public class Forum_Topic : Model
  2. {
  3. public int Save()
  4. {
  5. return QueryHandler.Update(InsertQuery, _title, _categoryId, ...);
  6. // stuurt insertid terug
  7. }
  8. }
  9.  
  10. public class Forum_Category : Model
  11. {
  12. public int Save()
  13. {
  14. return QueryHandler.Update(UpdateQuery, _title, ....);
  15. }
  16. }


De aanroep:
  1. Forum_Topic topic = new Forum_Topic(5); // fetch topic nr5
  2. topic.Title = "hallo dit is een titel"; // verander de titel
  3. Model_Save_Handler(topic); // update


Dan gaat dit niet werken aangezien hij in de methode Handle van Forum_Topic naar Modle cast.
Twee oplossingen:
1) van Handle een generic functie maken
2) de functie save ook in Model zetten

1)
  1. public static int Handle<T>(T m)
  2. {
  3. }

2)
  1. public class Model
  2. {
  3. public virtual int Save()
  4. {
  5. throw new Exception("Model.Save called!");
  6. }
  7.  
  8. }


En in je models zelf moet dan staan:
  1. public override int Save() ...


De woordjes virtual en override moet je gebruiken, anders gaat er in Handle gewoon de functie Save van Model aangeroepen worden, en niet diegene van onze subklassen.
Sommigen zullen zeggen dat virtual gelijk is aan abstract in php, maar dit is niet echt waar. Abstract heeft geen implementatie en virtual wel. Als Save in Model abstract zou zijn zou je de exceptie niet kunnen aanroepen.

Meer info:
http://www.code..._oops.html
http://ripalson...-questions/
http://support.microsoft.com/kb/307205
http://www.c-sh...iding.aspx
http://timstall...stract.htm

Polymorfisme in PHP
Hoewel override en virtual niet bestaan in PHP kent PHP wel polymorfisme, maar enkel in de abstracte manier, en dus niet met "virtual, override en new" (new is nog een ander keywoord dat veel weg heeft van override maar net iets anders werkt, zie laatste link bij meer info van vorig hoofdstuk voor meer info).

Hoe bovenstaande er zou uitzien in PHP:
  1. <?php
  2. class Model_Save_Handler
  3. {
  4. public static handle($m) // geen typehinting...
  5. {
  6. $insertId = $m->save();
  7. _logicFunction1();
  8. _logicFunction2();
  9. // etc...
  10. return $insertId;
  11. }
  12. // veel statische private functies die de logic afhandelen
  13. }
  14.  
  15. class Model
  16. {
  17. public save()
  18. {
  19. throw new Exception("Model::Save called!");
  20. }
  21. }
  22.  
  23. class Forum_Category extends Model
  24. {
  25. public save()
  26. {
  27. return QueryHandler::update($updateQuery, $_title, ...);
  28. // stuurt insertid terug
  29. }
  30. }



Meer info:
http://www.php.net/abstract
http://wiki.php...lymorphism
http://www.squi...lymorfisme

.NET FRAMEWORK

Hier ga ik enkele zaken van het .NET framework in webcontext (==> ASP.NET) uitleggen. Ik ga het hebben over Page (Controller en View), webforms, databinding en masterpages.

MVC en Page
Er is nu een soort van "nieuw" framework voor ASP.NET genaamd: ASP.NET MVC dat gebasseerd is het MVC-model (obviously), maar dat een hoop andere zaken van ASP.NET overboord gooit. Hierbuiten heeft de huidige ASP.NET geen Model. Het heeft wel een View en een Controller, maar geen Model. Het is wel mogelijk voor de gebruiker om zelf een eigen model systeem in elkaar te knutselen (iets wat ik heb gedaan).
Hoe het geheel werkt is eigenlijk hetzelfde als de controllers en views van php-frameworks. Je hebt een view (.aspx) waarin jou design code staat, en je hebt een code-behind file (.aspx.cs).

Wat is nu de kracht van C#.NET is zijn webomgeving (ASP.NET)?
Het antwoord is webcontrols. You either hate them or love 'em, but nothing in between...
ASP.NET is een op xml-gebasseerde opmaaktaal (a la xhtml...) maar dan volledig aangepast naar de noden van een server-side webprogrammeur. Je hebt controls die je het designen zoveel makkelijker maken: Repeater, LoginView, TreeView, en vele anderen. Vervolgens zijn er ook veel controls die het opstellen van een formulier vergemakkelijken: textbox (<input type="text" ...), checkboxlist, radiobuttonlist, ...
De view van .NET is een templatetaal (ASP.NET) om u tegen te zeggen.

De code-behind files zijn de controllers. Deze werken net zoals de controllers in php: ze communiceren rechtstreeks met de view files. Voorbeeld:
  1. public partial class paginanaam: System.Web.UI.Page
  2. {
  3. protected void Page_Load(object sender, EventArgs e)
  4. {
  5. eenLabel.Text = "waarde voor het label";
  6. TextBox tb = new TextBox();
  7. tb.Text = "waarde die in de <input type=\"text\" gaat staan";
  8. anderLabel.Controls.Add(new TextBox(tb));
  9. }
  10. }


DataBinden
Databinden is een principe in .NET dat je de mogelijkheid geeft eender welke vorm van array (collection (collectie van klassen), hashtable (associatieve array), tablerow (een rij uit een tabel), ...) aan een webcontrol te binden.
Als je bv. aan een checkboxlist een Collection van het type Antwoord zou binden (en Antwoord heeft een property Id en een property Text) dan zou volgende code ervoor zorgen dat er een hoop checkboxen worden aangemaakt met telkens de juiste value en text erbij:
  1. Model_Collection<Antwoord> antwoorden = new Model_Collection<Antwoord>();
  2. antwoorden.Fill("SELECT * FROM antwoorden");
  3. mijnCheckBoxList.DataSource = antwoorden;
  4. mijnCheckBoxList.DataValueField = "Id";
  5. mijnCheckBoxList.DataTextField = "Name";
  6. mijnCheckBoxList.DataBind();


I hope you get the picture:-)

Masterpages
Een masterpage is wat in PHP een index.php pagina zou zijn. Deze pagina geeft alle standaard zaken weer: menu, header, footer, etc... de content wordt hier ingeladen. In .NET moet je gewoon meegeven wat je masterpage is en waar de content moet komen. De engine doet de rest:

  1. // masterpage:
  2. [HEADER]
  3. [MENU]
  4. <asp:contentplaceholder id="content" runat="server" />
  5. [FOOTER]
  6.  
  7. // childpage:
  8. <%@ Page MasterPageFile="~/MasterPage.master" ...%>
  9.  
  10. <asp:Content ID="paginaContent" ContentPlaceHolderID="content" Runat="Server">
  11. HIER JE CONTENT
  12. </asp:Content>


Dit zijn natuurlijk enkele kleine voorbeeldjes van het .NET framework (voor online gebruik). Maar dit zijn de zaken die php-programmeurs ook het meest intrigeren.

meer info:
http://msdn2.microsoft.com/en-us/library/aa360256(VS.85).aspx
http://msdn2.mi...78138.aspx
http://www.c-sh...esign.aspx
http://www.ivobrugge.be/cursusweb/ASPNET/list.asp
http://msdn2.mi...52347.aspx
http://msdn2.mi...bf3hh.aspx
http://www.odetocode.com/articles/419.aspx

waarom de talen worden opgehemeld door hun programmeurs

... nja ... daar is dit topic voor hé!

___
petje af als je dit allemaal gelezen hebt;-)
met vriendelijk groet
koen

6 antwoorden

Gesponsorde links
Offline Stijn - 29/03/2008 15:39
Avatar van Stijn PHP expert Over die collection class valt er iets op te vinden in PHP. Ik heb er het volgende op gevonden. Vertel mij maar eens wat je ervan denkt?

http://www.plaatscode.be/6343/

Het werkt zowel bij parents als childs.
Offline nemesiskoen - 29/03/2008 15:53 (laatste wijziging 29/03/2008 16:01)
Avatar van nemesiskoen Gouden medaille

PHP expert
Wat je nu hebt is een niet generic collection class. Dat singleton patroon is daar eigenlijk niet nodig (mag eigenlijk niet) want nu sla je alle items op in 1 array. De controle _op_ het type is er nu wel, wat goed gevonden is. Maar hier maak je geen gebruik van polymorfisme en typehinting.
Probeer het voorbeeld eens uit te breiden met een moeder en 2 child klassen. Waarbij de moeder een functie 'a' heeft en beide childs ook een functie 'a'. Laat vervolgens enkel in de collectionclass objecten van het type moeder (en dus automatisch ook de childs) toe via typehinting. En roep dan 'a' eens op bij het terug opvragen. Ik weet niet echt wat php gaat doen, maar normaal gezien zal 'a' van moeder worden gecalled en niet van het child.
  1. <?php
  2. ...
  3. function add(Moeder $m)
  4. {
  5. .. logic ..
  6. }
  7. ...
  8.  
  9. $collection->add(new Child1());
  10. $item = $collection->getItem(1); // stuurt index 0 item terug
  11. $item->a(); // zal volgens mij niet a van child aanroepen maar van moeder (zou ook logisch zijn)


Snap je wat ik bedoel?
Offline Stijn - 29/03/2008 16:10 (laatste wijziging 29/03/2008 16:11)
Avatar van Stijn PHP expert Ik heb het geprobeert zoals jij het verteld en PHP roept de methode op van de child en niet van de parent.

http://www.plaatscode.be/6344/

Ik weet dat het geen generic collection class is maar het zou een "goeie" variant ervan kunnen zijn. Ik heb enkel ervaring met generic collection dankzij Java.
Offline nemesiskoen - 29/03/2008 16:15 (laatste wijziging 29/03/2008 16:15)
Avatar van nemesiskoen Gouden medaille

PHP expert
Obviously, omdat er niet wordt gecast.
  1. addCollectionItem( $item )


maak daar eens:
  1. addCollectionItem( Example $item )

van.
Offline Stijn - 29/03/2008 16:17 (laatste wijziging 29/03/2008 16:20)
Avatar van Stijn PHP expert Ik heb daar ook al aan gedacht maar dan moet je voor iedere class een andere Collection class schrijven. Ik zal het eens doen met typehinting.

Het resultaat is nog steeds hetzelfde. De child roept de methode op van zichzelf en niet van zijn parent.

http://www.plaatscode.be/6345/
Offline nemesiskoen - 29/03/2008 16:23
Avatar van nemesiskoen Gouden medaille

PHP expert
Eigenlijk niet logisch vind ik. In JAVA en C# zou er zowiezo gecast zijn naar dat type, blijkbaar is doet die typehinting niets. Buiten even controleren "typeof". Maarja, PHP is dan ook een type-loze taal.
Citaat:
Ik heb daar ook al aan gedacht maar dan moet je voor iedere class een andere Collection class schrijven.

Als je een aangepaste collection klasse wilt hebben voor je models dan is iets van het type "object" ontvangen niet goed he. Dit geld dan weer enkel voor C# en JAVA, want PHP valt hier volledig buiten. Als je bv. wil zoeken op id van je models, dan moet er wel eerst van Object gecast worden naar Model, omdat Object geen property "Id" zal hebben.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 1.532s