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:
clone()
equals(Object obj)
finalize()
getClass()
hashCode()
notify()
notifyAll()
toString()
wait()
wait(long timeout)
wait(long timeout, int nanos)
clone() equals(Object obj) finalize() getClass() hashCode() notify() notifyAll() toString() wait() wait(long timeout) 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:
function test($var = 1, $var2 = 3) {
//
}
function test($var = 1, $var2 = 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:
public int test() {
return test(1, 3);
}
public int test(int var) {
return test(var, 3);
}
public int test(int var, int var2) {
// de echte functie code
}
public int test() { return test(1, 3); } public int test(int var) { return test(var, 3); } public int test(int var, int var2) { // de echte functie code }
(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:
clone() // maak een clone aan van het object
equals() // is een object dezelfde render-waarde als een ander object
finalize() // deze kennen we eigenlijk allemaal (voor de OO-kenners dan) maar dan onder een andere naam;)
getClass() // pretty obvious
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()
toString() // kennen we:)
clone() // maak een clone aan van het object equals() // is een object dezelfde render-waarde als een ander object finalize() // deze kennen we eigenlijk allemaal (voor de OO-kenners dan) maar dan onder een andere naam;) getClass() // pretty obvious 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() 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:
<?php
abstract class Object {
public function clone() {
return clone($this);
}
public function equals(Object $obj) {
if($obj->getClass() === $this->getClass()) {
return $obj->hashCode() == $this->hashCode();
}
return false;
}
public function __destruct() {
return $this->finalize(); // hiervan kenden we die finalize:)
}
public function finalize() {}
public function getClass() {
return getClass($this);
}
public function hashCode($method = "md5") {
return $method($this->toString());
}
public function toString() {
return $this->__toString();
}
}
<?php abstract class Object { public function clone() { return clone($this); } public function equals(Object $obj) { if($obj->getClass() === $this->getClass()) { return $obj->hashCode() == $this->hashCode(); } return false; } public function __destruct() { return $this->finalize(); // hiervan kenden we die finalize:) } public function finalize() {} public function getClass() { return getClass($this); } public function hashCode($method = "md5") { return $method($this->toString()); } public function toString() { return $this->__toString(); } }
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!
|