login  Naam:   Wachtwoord: 
Registreer je!
 Forum

abstract AND Interfaces

Offline Stijn - 06/02/2006 17:27
Avatar van StijnPHP expert hallo

Ik ben er al een tijd mee bezig maar lees net op php.net dit:
abstract class MyClass{ ... }

en dit:

interfaces class MyClass{ ... }

Kan iemand me uitleg geven over die 2 dingen want snap het niet Ik denk dat die class met abstract & interfaces in ieder geval niet extern kan aangeroepen worden... Maar wel in een extend class. Maar waar zit het verschil of ben ik verkeerd?

groeten
stijn

17 antwoorden

Gesponsorde links
Offline Lemon - 06/02/2006 17:41
Avatar van Lemon PHP expert van een abstracte class kan je geen object van maken.

Bijvoorbeeld stel je hebt het de klasse Auto.

bij een non-abstracte klasse kan je doen: $auto = new Auto();

bij een abstracte klasse kan je dat net niet doen. (abstracte klasses zijn handig als je een hoop abstracte functies wil groeperen, bijvoorbeeld een Math class).

Interfaces bij php weet ik niet direct, maar bij java zijn interfaces die een reeks methodes/functies omschrijven die de class moet bevatten die de interface implementeerd (om het lekker ingewikkeld te zeggen )
Offline nemesiskoen - 06/02/2006 17:47
Avatar van nemesiskoen Gouden medaille

PHP expert
Om een duidelijk voorbeeld te geven van interfaces:

Kan zijn dat de syntaxis niet volledig klopt maar daar komt het nu niet op aan.

Stel je bent bezig met een project dat Object geöriënteerd is. Je library bestaat uit enkele classes en al deze (of een groot deel van deze) classes bevatten de methode 'mail'. Om problemen te voorkomen dat iemand een mail stuurt op methode A en iemand anders op methode B wordt vooraf de methode gedefiniëerd.

  1. interface Mail {
  2. public function stuurMail();
  3. }
Offline Stijn - 06/02/2006 17:47
Avatar van Stijn PHP expert hehe cool Pft, het is echt zware kost die OOP handleiding op PHP.net. Zo lees ik ook __sleep(); en __wakeup(); ik ken __construct en __destruct maar die Kan je die uitleggen? 

Want volgens mij is dat een object die gewoon niet uitgevoerd wordt tot hij weer aangeroepen wordt...
Offline Lemon - 06/02/2006 17:52
Avatar van Lemon PHP expert is __construct niet de constructor (wordt uitgevoerd bij het aanmaken van het object).

en de __destruct een methode die uitgevoerd wordt als het object 'afgesloten' wordt?
Offline Voldemort - 06/02/2006 17:54 (laatste wijziging 06/02/2006 17:58)
Avatar van Voldemort PHP ver gevorderde Er wordt:

__sleep(); en __wakeup();

bedoeld denk ik.

PS: Ik ben van plan ook OOP te leren, maar wat is het nut van een constructor (__construct)?
Offline nemesiskoen - 06/02/2006 17:59 (laatste wijziging 06/02/2006 18:11)
Avatar van nemesiskoen Gouden medaille

PHP expert
__sleep en __wakeup heb je nodig wanneer je je object serialiseerd. Dit betekend de waardes onthouden en deze in string formaat opslaan. Zo kan je dus een heel object in 1 row opslaan. Het probleem is dat serialize nogal wat problemen heeft met results dus daarom kan je deze variabelen laten 'slapen'. Bij de aanroepn van __wakeup() moet je ze weer 'setten'...

Denk er aan, een instantie van een class (het object) deserializeren kan alleen op een pagina waar de class definitie voorkomt (vrij logisch maar wordt veel vergeten).

Serializeren heeft als voordeel dat je een soort van 3D database model kunt maken.

Het nut van de constructor is bv. dat je bepaalde acties direct kan uitvoeren.

Bv.

  1. <?php
  2. class Calc {
  3.  
  4. public function __construct($get1, $get2) {
  5.  
  6. list($this->getal1, $this->getal2) = array($get1, $get2);
  7.  
  8. }
  9.  
  10. public function doCalc() {
  11.  
  12. return $this->getal1 * $this->getal2;
  13.  
  14. }
  15.  
  16. private $getal1;
  17. private $getal2;
  18.  
  19. }
  20.  
  21. $c = new Calc(5,6);
  22. echo $c->doCalc();
  23. ?>


Dit is offcourse een heel dom voorbeeld...
Offline Stijn - 06/02/2006 18:03 (laatste wijziging 06/02/2006 18:04)
Avatar van Stijn PHP expert
  1. <?
  2. class MyForm
  3. {
  4. public function __construct( $foo )
  5. {
  6. echo $foo;
  7. }
  8. }
  9.  
  10. $obj = new MyForm( 'bar' );
  11.  
  12. /*
  13. in PHP4 is dit dan
  14. function MyForm( $foo );
  15. */
  16. ?>


ps: ik bedoelde idd sleep(); en wakeup();

edit
thx koen maar ik denk niet dat ik die nodig zal hebben (nu toch niet)
Offline nemesiskoen - 06/02/2006 18:10 (laatste wijziging 06/02/2006 18:12)
Avatar van nemesiskoen Gouden medaille

PHP expert
Om even een voorbeeld te geven van __sleep en __wakeup:

  1. <?php
  2.  
  3. class Test {
  4.  
  5. public function __construct($var, $foo, $bar) {
  6.  
  7. list($this->tvar, $this->foo, $this->bar) = array($var, $foo, $bar);
  8.  
  9. }
  10.  
  11. function __sleep() {
  12.  
  13. // deze vars zullen mee geserializeerd worden
  14.  
  15. return array('tvar', 'foo');
  16.  
  17. }
  18.  
  19. function __wakeup() {
  20.  
  21. $this->bar = "blaat";
  22.  
  23. }
  24.  
  25. public function run() {
  26.  
  27. echo $this->tvar . $this->foo . $this->bar;
  28.  
  29. }
  30.  
  31. private $tvar;
  32. private $foo;
  33. private $bar;
  34.  
  35. }
  36.  
  37. $test = new Test('blaat', 'blaat2', 'blaat3');
  38. $test = serialize($test); // __sleep wordt aangeroepen
  39. $test = unserialize($test); // __wakeup wordt aangeroepen
  40. $test->run(); // normaal gezien 'blaatblaat2blaat'
  41. ?>
Offline Stijn - 06/02/2006 18:18
Avatar van Stijn PHP expert bedankt, zal er eens een nachtje op moeten slapen. Ik snap die serialize niet zo goed 
Offline nemesiskoen - 06/02/2006 18:25
Avatar van nemesiskoen Gouden medaille

PHP expert
Het is hoogstwss dat PHP ook alle data die in een array wordt gestoken serializeerd. Zo kan PHP associatieve arrays hebben. Eigenlijk zijn het gewoon allemaal string arrays met geserializeerde waardes... maar dit is te hard doordenken en offtopic:)
Offline Stijn - 06/02/2006 18:30
Avatar van Stijn PHP expert :| wtf , overflood data. Best op het gemak doen 
Offline bdeh_af - 07/02/2006 10:17
Avatar van bdeh_af PHP interesse Een abstracte klasse is een klasse waarvan geen object kan gemaakt worden. Abstracte klassen worden gebruikt andere klassen uit af te leiden.

Een interface is geen klasse, maar een model voor een klasse. Wanneer we een klasse een interface implementeerd dan moeten alle functies die in deze interface staan ook in de klasse voorkomen.

Wat is nu het verschil tussen beiden?

Abstracte klassen kunnen functies bevatten die reeds geprogrammeerd zijn en die dus kunnen worden aangeroepen worden in afgeleidde klassen. Interfaces bevatten slechts de declaratie ervan. Ditzelfde geld voor klasse-variabelen.

Hopelijk is nu alles wat duidelijker?
Offline Stijn - 07/02/2006 20:45
Avatar van Stijn PHP expert Hehe ik heb iets waarmee ik zit:
  1. <?
  2. class first
  3. {
  4.  
  5. protected $naam;
  6.  
  7. protected function name( $var )
  8. {
  9. $this->naam = naam;
  10. }
  11.  
  12. }
  13. class MyForm extends first
  14. {
  15. //hier nog wat rommel
  16. }
  17. class third extends MyForm
  18. {
  19. //lalala
  20. }
  21. ?>

Kan ik vanuit third-class een function/variable oproepen van first class met dit voorbeeld en hoe doe ik dit dan?

groeten
stijn
Offline nemesiskoen - 07/02/2006 21:03
Avatar van nemesiskoen Gouden medaille

PHP expert
$this->naam = naam;
==>
$var!!!

function third() { echo $this->naam; }
Offline Stijn - 27/02/2006 20:24
Avatar van Stijn PHP expert hallo (opnieuw)

Ik heb een idee in me hoofd en zou het graag volledig uitwerken in classes. Ik heb hier één vraag over. Ik zou één hoofdclass maken en alle andere classes zijn dan extends of de hoofdclass. Kan ik dan via
$obj = new class();
$obj->functie_uit_2e_class( $obj->var_uit_3e_class );


aanroepen??

stijn
Offline Richard - 27/02/2006 21:07
Avatar van Richard Crew algemeen als die classes allemaal extends van elkaar zijn;)

dus bijv:

  1. <?php
  2. class class_1
  3. {
  4. /* ... */
  5. }
  6. class class_2 extends class_1
  7. {
  8. public function class_2_function ($var)
  9. {
  10. /* ... */
  11. $opt_var = &$var;
  12. return $opt_var;
  13. }
  14. }
  15. class class_3 extends class_2
  16. {
  17. public $class_3_var = '...';
  18. }
  19.  
  20. // in php4 zou ik hier = &new van maken, in php5 gebeurt dit auto;)
  21. $obj = new class_3;
  22. echo $obj->class_2_function ($obj->class_3_var);
  23. ?>
Offline nemesiskoen - 27/02/2006 23:27
Avatar van nemesiskoen Gouden medaille

PHP expert
Dat is het dus niet Jexus, omdat alle classes afgeleid zijn van de hoofdklas en niet van elkaar.
Je kan dus wel een variabele aanroepen vanuit een andere class als je die meegeeft in een argument.

Deze constructie werkt bv ook:

  1. <?php
  2. class Een {
  3. } /* just an example */
  4. class Twee extends Een {
  5. var $de_derde;
  6. function Twee($een_derde) {
  7. $this->de_derde = $een_derde;
  8. }
  9. function doe_iets() {
  10. echo $this->de_derde->de_var;
  11. }
  12. }
  13. class Drie extends Een {
  14. var $de_var;
  15. function Drie($een_var) {
  16. $this->de_var = $een_var;
  17. }
  18. }
  19. $een_derde = new Drie(5);
  20. $een_tweede = new Twee($een_derde);
  21. $een_tweede->doe_iets();
  22. ?>


output is dan 5
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.246s