login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Super Class

Offline nemesiskoen - 14/07/2006 14:26 (laatste wijziging 14/07/2006 14:52)
Avatar van nemesiskoenGouden medaille

PHP expert
De kracht van JAVA zit hem in het objectmodel. Om specifieker te zijn in de Object klasse: de moeder klasse van alle objecten.

Ik, als naïeve lezer, nam aan dat dit specifiek voor JAVA was en andere OO-talen dit niet hadden (sommige mogelijk wel, maar php niet direct). Ik weet het nut van de klasse Object dankzij het programma BlueJ (dat je veel verklapt over het objectmodel van JAVA). Dus ik denk: laten we eens kijken hoe dat er bij php zou uitzien.

Eerst even een lijstje van de Object methodes:

  1. clone()
  2. equals(Object obj)
  3. finalize()
  4. getClass()
  5. hashCode()
  6. notify()
  7. notifyAll()
  8. toString()
  9. wait()
  10. wait(long timeout)
  11. wait(long timeout, int nanos)


Een korte verklaring bij de laatste 3 methodes voor de javaleek:
java kent geen optionele parameters (of hoe ze ook noemen) zoals php dit wel kent:
  1. function test($var = 1, $var2 = 3) {
  2. //
  3. }

Zo kan je de functie test op 3 manieren oproepen: test(), test(5) en test(5, 7).
Bij JAVA moet je gewoon 3 maal de methode declareren. Meestal krijg je dan zoiets als:

  1. public int test() {
  2. return test(1, 3);
  3. }
  4. public int test(int var) {
  5. return test(var, 3);
  6. }
  7. public int test(int var, int var2) {
  8. // de echte functie code
  9. }

(om maar een voorbeeld te geven hoe flexibel php weer kan zijn).

Nu dit opgehelderd is kunnen we verder gaan.
De thread functies heb ik tijdelijk genegeerd, omdat php dit niet kent.
Wat blijft er dan over:
  1. clone() // maak een clone aan van het object
  2. equals() // is een object dezelfde render-waarde als een ander object
  3. finalize() // deze kennen we eigenlijk allemaal (voor de OO-kenners dan) maar dan onder een andere naam;)
  4. getClass() // pretty obvious
  5. hashCode // stuurt een hash waarde terug (voor te vergelijken), ik weet niet zeker maar ik gok erop dat dit wordt gebruikt voor de method object.equals()
  6. toString() // kennen we:)


en de rest zijn thread-methods.

Wat zien we nu: enkele van deze methodes bestaan al als gewone functies en de rest zijn vanaf php5 bekend onder de naam: magic methods. Sterker nog: php heeft een hoop meer magic methods dan JAVA.

Even een voorbeeld van de Object-klasse van JAVA geschreven in php:

  1. <?php
  2.  
  3. abstract class Object {
  4.  
  5. public function clone() {
  6. return clone($this);
  7. }
  8.  
  9. public function equals(Object $obj) {
  10. if($obj->getClass() === $this->getClass()) {
  11. return $obj->hashCode() == $this->hashCode();
  12. }
  13. return false;
  14. }
  15.  
  16. public function __destruct() {
  17. return $this->finalize(); // hiervan kenden we die finalize:)
  18. }
  19.  
  20. public function finalize() {}
  21.  
  22. public function getClass() {
  23. return getClass($this);
  24. }
  25.  
  26. public function hashCode($method = "md5") {
  27. return $method($this->toString());
  28. }
  29.  
  30. public function toString() {
  31. return $this->__toString();
  32. }
  33.  
  34. }


Het is maar een dummy class, dus het kan zijn dat deze parse errors geeft maar het idee is duidelijk hoop ik.

Wat zien we nu: php heeft ook een moederklasse waaruit elke klasse is afgeleid en dus de magic methods heeft. PHP's objectmodel lijkt nu nog sterker op dat van JAVA dan voorheen (IMO dan).

Om even een lijstje te geven:
private $object->__destruct() == anObject.finalize()
private $object->__toString() == anObject.toString()
getClass(Object $obj) == anObject.getClass()
clone(Object $obj) == anObject.clone()
private $object->__sleep == ... je kan dit een beetje vergelijken met threads maar niet helemaal ...
private $object->__wakeup == ... idem als hierboven ...
private $object->__get == ?
private $object->__set == ?
// enz


Eigenlijk leuk om het van deze kant te bekijken. Nooit gedacht dat php's Objectmodel zo sterk op dat van java zou lijken.
Nuja, ik zou graag reacties hebben op dit klein onderzoekje/deze kleine review: wat jullie ervan vinden, of jullie dit ook al doorhadden of dat het ook allemaal zo logisch leek?
Ik heb er in ieder geval weeral van geleerd!

5 antwoorden

Gesponsorde links
Offline MFdriver - 14/07/2006 15:05
Avatar van MFdriver PHP interesse dat hadden ze toch al altijd zeggen, dat php5's objectenmodel erg goed leek op dat van java?
Offline Ontani - 14/07/2006 15:10
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
dat was het eerste wat ik zei toen ik een php classe onder m'n neus kreeg geduwd: "Damn da lijkt serieus veel op java"
Offline Richard - 14/07/2006 15:16
Avatar van Richard Crew algemeen Goed uitgelegd, maarre, was dit sowieso al niet het doel vanaf PHP5?
Offline nemesiskoen - 14/07/2006 15:20
Avatar van nemesiskoen Gouden medaille

PHP expert
True, maar voor zover ik wist ging dit enkel over encapsulatie, abstractie en blauwdruk (interfaces). Ik wist niet dat php ook een 'Object klasse' had. Dit kan ik toch nergens vinden op de php.net site.
Offline Tri - 14/07/2006 17:22
Avatar van Tri PHP interesse Als je het zo bekijkt heb je wel gelijk, het komt sterk overeen. Alleen zijn er wel belangrijke verschillen. Zo kan je in Java een instantie maken van Object. PHP kent dit niet.
Daarnaast als je de Zend engine bekijkt, in feite krijgen objecten gewoon de magic methodes 'toegewezen' als iets extra's. Dat kun je niet vergelijken met overerving, wat in Java wel het geval is. Alle classes in Java erven van Object.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.253s