Mijn eerste OOP code :-)
Code (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
31
32
33
34
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
31
32
33
34
<?php
/**
* Class TelObjects heeft drie functies:
* - __construnct() -> verhoogt teller met 1 bij het aanmaken van een object
* - toonteller() -> toont de huidige waarde van de teller
* - __destruct() -> verlaagt de teller met 1 bij het verwijderen van een object
*/
class TelObjects
{
public static $teller = 0;
function __construct()
{
self::$teller++;
}
public function toonteller()
{
echo self::$teller;
}
function __destruct()
{
self::$teller--;
}
}
// Maak twee nieuwe objecten van TelObjects
$oTel = new TelObjects();
$oTel2 = new TelObjects();
$oTel->toonteller(); // 2
$oTel->__destruct(); // Vernietig object $oTel
$oTel2->toonteller(); // 1
?>
/**
* Class TelObjects heeft drie functies:
* - __construnct() -> verhoogt teller met 1 bij het aanmaken van een object
* - toonteller() -> toont de huidige waarde van de teller
* - __destruct() -> verlaagt de teller met 1 bij het verwijderen van een object
*/
class TelObjects
{
public static $teller = 0;
function __construct()
{
self::$teller++;
}
public function toonteller()
{
echo self::$teller;
}
function __destruct()
{
self::$teller--;
}
}
// Maak twee nieuwe objecten van TelObjects
$oTel = new TelObjects();
$oTel2 = new TelObjects();
$oTel->toonteller(); // 2
$oTel->__destruct(); // Vernietig object $oTel
$oTel2->toonteller(); // 1
?>
Niet te zeggen dat deze code top is (de eerste aanzet komt uit het boek PHP 5 voor gevorderden), maar het is heel apart, om het idee te hebben dat je ogen echt 'open' gaan voor OOP.
PS: ik dacht dat ik dit topic beter niet kon openen in site reviews omdat het niet over een website gaat.
Gewijzigd op 01/01/1970 01:00:00 door Kvdd
Ok en wat is je punt nu?
Allemaal even klappen :)
is dit toch spannender
Dan komt de magie van Magic Method __desctruct toch meer tot z'n recht.
Edit: over de code; waarom is $teller public, en waarom hebben __construct & __destruct geen visibility-keyword (public/protected) ervoor staan?
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
@iChris.nl: idd, voor zo een fantastisch script :-)
@jelmer: laat ik __destruct nou stoerder vinden! (-;
Edit @ jelmer: Omdat een constructor en een destructor altijd public zijn, vindt ik de toevoeging public nogal overbodig. Misschien dat het wel netter is als je het wel erbij zet..
Hoe maak jij een object als je constuctor of destructor protected of private is?? (kan niet dus)
De teller moet inderdaad private zijn, omdat die niet wordt gedeelt met andere classes (dus geen protected) en ook niet gewijzigd mag worden.
Iig bedankt voor je toevoeging!
Gewijzigd op 01/01/1970 01:00:00 door kvdd
kvdd schreef op 11.07.2008 14:50:
Edit @ jelmer: Omdat een constructor en een destructor altijd public zijn, vindt ik de toevoeging public nogal overbodig. Misschien dat het wel netter is als je het wel erbij zet..
Hoe maak jij een object als je constuctor of destructor protected of private is?? (kan niet dus)
Hoe maak jij een object als je constuctor of destructor protected of private is?? (kan niet dus)
Code (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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class DatabaseConnection
{
public static function get()
{
static $db = null;
if ( $db == null )
$db = new DatabaseConnection();
return $db;
}
private $_connection = null;
private function __construct()
{
$this->_connection = &DataObject::Connect2db();
}
public function handle()
{
return $this->_connection;
}
}
?>
class DatabaseConnection
{
public static function get()
{
static $db = null;
if ( $db == null )
$db = new DatabaseConnection();
return $db;
}
private $_connection = null;
private function __construct()
{
$this->_connection = &DataObject::Connect2db();
}
public function handle()
{
return $this->_connection;
}
}
?>
Om m'n connectie-resource op te halen:
dus constructor kan wel private zijn, want ik wil niet dat er een 2e connectie ontstaat als die class public aangeroepen wordt..
Gewijzigd op 01/01/1970 01:00:00 door Terence Hersbach
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
En ik verkies zelf protected boven private vanuit praktisch oogpunt. Mocht het zo zijn dat ik een klasse moet uitbreiden/aanpassen, maar ik het oorspronkelijke bestand om praktische redenen beter niet kan aanpassen, dan kan ik hem extenden. Als de properties die ik moet aanpassen om mijn functionaliteit goed te krijgen private zijn, kom ik geen stap verder. Een goeie programmeur zou rekening gehouden hebben met toekomstige uitbreidingen, en dan dus de nodige getters/setters/modifiers aan de basisklasse hebben toegevoegd... maar rekening houden met alle mogelijke uitbreidingen is knap lastig. Daarom maak ik zelf properties bij voorkeur protected zodat ik, of anderen geen rare truucjes hoef uit te halen om bij de gegevens te komen (Reflection API erbij pakken, rare serialize truucjes) Want macht die je bij een programmeur weghaalt zal hij proberen te herstellen, hoe ranzig de gevolgen ook mogen zijn. Private is naar mijn idee alleen handig wanneer je een property hebt die door slechts 1 method (of een paar gezamenlijke methods) gebruikt wordt en alleen voor die methods nuttige data heeft waar je buiten die methods hoe dan ook niets aan hebt. Bijvoorbeeld tijdelijke data of een cache. Geen informatie.
Als laatste doet __destruct niet hetzelfde als unset. Direct __destruct aanroepen is niets meer dan een normale method-aanroep. Unset daarentegen haalt het object ook werkelijk weg uit het geheugen. Het idee van __destruct is dat je je rotzooi kan opruimen (in C++ en Obj-C bijvoorbeeld het verlagen van reference-counters) waar het object afhankelijk van is. Het is een soort callback voor een event, en de method is ook niet verplicht. Sterker nog, waarschijnlijk zal je hem in praktijk heel weinig gebruiken.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Zeer duidelijke uitleg beiden. Zo te zien nog een hoop te leren, en heb alleen het basis concept tussen mn oren.
Maar anyway, bovenstaande heeft veel verhelderd hoe je dingen afhandeld etc.
/me blijft natuurlijk proud op zn eerste OOP script! ;-)
Gewijzigd op 01/01/1970 01:00:00 door kvdd
Trouwens, nog een tipje: Probeer 'echo' binnen je klassen zo veel mogelijk te vermeiden. Want het is niet aan je klasse om te beslissen dat de waarde die een functie uitrekent naar de output-buffer moet. Misschien wil je hem wel gebruiken in een template, of als argument voor een andere functie, of als variabele voor in een mailtje. 'return' heeft bijna altijd de voorkeur.
Dat is inderdaad beter, nu je het zegt. Anders zit je zogezegd eraan vast dat de waarde geechoed wordt, en dat wil je niet natuurlijk.