Mijn eerste OOP code :-)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Kvdd

kvdd

11/07/2008 13:35:00
Quote Anchor link
Laat ik het niet spannend maken, hier de code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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
?>


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
 
PHP hulp

PHP hulp

19/04/2024 09:59:13
 

11/07/2008 13:50:00
Quote Anchor link
Ok en wat is je punt nu?
 
- -

- -

11/07/2008 13:53:00
Quote Anchor link
Allemaal even klappen :)
 
Jelmer -

Jelmer -

11/07/2008 14:17:00
Quote Anchor link
In plaats van
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$oTel
->__destruct()
?>

is dit toch spannender
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
unset($oTel);
?>

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 -
 
Kvdd

kvdd

11/07/2008 14:50:00
Quote Anchor link
@Karl: geen punt..

@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
 
Terence Hersbach

Terence Hersbach

11/07/2008 14:59:00
Quote Anchor link
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)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
  }
}

?>


Om m'n connectie-resource op te halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
DatabaseConnection::get()->handle()
?>


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
 
Jelmer -

Jelmer -

11/07/2008 15:10:00
Quote Anchor link
Private/protected constructors kunnen wel degelijk nuttig zijn, zoals Terence hierboven al zegt, bijvoorbeeld om Singleton af te dwingen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class Zon {
    static public function sharedInstance() {
        static $instance;
        
        return $instance ? $instance : $instance = new self();
    }

    
    private function __construct() {
        
    }
}


$a = Zon::sharedInstance();

$a->temperatuur = 'heet';

$b = Zon::sharedInstance();

echo $b->temperatuur;

$c = new Zon(); // -> error!
?>


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 -
 
Kvdd

kvdd

11/07/2008 15:37:00
Quote Anchor link
@Terence en @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
 
Jelmer -

Jelmer -

11/07/2008 15:54:00
Quote Anchor link
En zo hoort het ook :)

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.
 
Kvdd

kvdd

11/07/2008 16:13:00
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.