login  Naam:   Wachtwoord: 
Registreer je!
 Forum

abstract en interfaces

Offline Ultimatum - 13/08/2007 22:56
Avatar van UltimatumPHP expert Ey, ik lees nu net een tutorial en daar staan dingen in die ik niet helemaal begrijp. Ik ben het nu al een aantal keer tegen gekomen en nog snap ik er geen hout van. De tutorial is in het engels en hoewel mijn engels goed is snap ik het nog niet helemaal. Zou iemand het misschien beter kunnen uitleggen? Dit zijn de codes die in de tutorial staan (Om even voorbeeld te geven)

  1. <?php
  2. abstract class Weapon
  3. {
  4. private $SerialNumber;
  5. abstract public function fire();
  6.  
  7. public function __construct($SerialNumber)
  8. {
  9. $this->SerialNumber = $SerialNumber;
  10. }
  11. public function getSerialNumber()
  12. {
  13. return $this->SerialNumber;
  14. }
  15. }
  16. ?>


Waarom moet deze class nou abstract? Omdat er 1 functie is die verschilt per keer?

Dit stond er ook nog bij de vorige code block:
  1. <?php
  2. class Gun extends Weapon
  3. {
  4. public function fire()
  5. {
  6. if($this->SafetyOff) {
  7. return $this->CurrentBullet;
  8. }
  9. }
  10. }
  11.  
  12. class Cannon extends Weapon
  13. {
  14. public function fire()
  15. {
  16. $this->NeedsLoading = true;
  17. return $this->CurrentCanon;
  18. }
  19. ?>


En interfaces, als voorbeeld staat er dit:
  1. <?php
  2. interface DB
  3. {
  4. public function connect();
  5. public function error();
  6. public function errno();
  7. public static function escape_string($string);
  8. public function query($query);
  9. public function fetch_array($result);
  10. public function fetch_row($result);
  11. public function fetch_assoc($result);
  12. public function fetch_object($result);
  13. public function num_rows($result);
  14. public function close();
  15. }
  16. ?>


En dan werkt er zo nog een classe aangemaakt?
class MySqlDB implements DB

Maar waarom eerst die interfaces aanmaken en dan nog de classe? Is toch dubbel op en heeft in mijn ogen geen betekenis?

Hier staat de gehele tutorial. Alvast bedankt 
http://www.vbforums.com/showthread.php?t=378700

11 antwoorden

Gesponsorde links
Offline ikki007 - 13/08/2007 23:06
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Abstract wordt hier uitgelegd:

http://www.phphulp.nl/php/tutorials/8/289/560/
Offline Ultimatum - 13/08/2007 23:19
Avatar van Ultimatum PHP expert Oke, maar wat is precies het nut hier nou van dan? Want ik mis het punt van die code op phphulp echt helemaal want er zit geen nut aan die classe. Ik weet dat het een voorbeeld is maar dan nog.
Offline ikki007 - 13/08/2007 23:55
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Het voorbeeld dat gegeven is hoeft niet abstract alleen ze hebben hem abstract gemaakt om het te laten zien wat het inhoud.
Maar het heeft absoluut geen nut nu nee.
Offline Rik - 14/08/2007 10:07
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Citaat:
We are going to use an interface in our database abstraction layer, to ensure that every time we create a class for a particular database, it exposes the same API. When using them, we can then rely on the methods defined in the interface being part of the class, because, if they are not, PHP will not parse it.


Een interface wordt gebruikt als je zeker wil weten dat de implementerende (raar woord ) class alle methodes van de interface class gedefinieerd heeft. Als je in de interface zet dat er een functie connect() is, maar als die niet in de implementerende class staat geeft php een foutmelding:
  1. interface DB {
  2. function connect();
  3. }
  4.  
  5. class MySQL implements DB {
  6.  
  7. }
==>
Citaat:
Fatal error: Class MySQL contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (DB::connect)


Je kan hetzelfde bereiken door in plaats van een interface een abstracte class te maken en voor elke functie die in de extendende (weer zo'n raar woord  ) class voor moet komen "abstract" te zetten. Dan geeft php ook een foutmelding als de functie niet bestaat in die extendende class.
Offline marten - 14/08/2007 10:28
Avatar van marten Beheerder Functioneel voorbeeld:

5 programmeurs werken aan 1 project. 1 programmeur maakt de hele indeling. Deze bepaald dat in Class Foo 3 methods moeten komen met de namen FooBar BarFoo en vinTage. Hij maakt deze dus interface zodat een andere programmeur weet dat hij deze functies moet gebruiken.
Offline Ultimatum - 14/08/2007 11:11
Avatar van Ultimatum PHP expert Dus een interface is gewoon om te zorgen dat als er 5 functies moeten zijn, er ook daadwerkelijk 5 worden aangemaakt?
Offline marten - 14/08/2007 11:25 (laatste wijziging 14/08/2007 11:25)
Avatar van marten Beheerder Ja en met dezelfde namen en properties
Zo kan je dus vervolgens ook weer verder scripten met die methods. En dat dan een ander de inhoud aan de methods geeft
Offline Ultimatum - 14/08/2007 11:38
Avatar van Ultimatum PHP expert Maar wat is nou het grote voordeel van interfaces dan, want als er echt 5 functies moeten zijn dan maak ik die 5 tochook wel zonder een interface, en als ik er dan 1 vergeet dan maak je hem toch gewoon aan? Daar heb je geen interface voor nodig (Lijk me?)
Offline Mad_Mike - 14/08/2007 12:24
Avatar van Mad_Mike PHP beginner toch wel dus 

Stel je maakt al enige tijd gebruik van enkele goede classes. Deze kan je dan mooi hergebruiken in nieuwe projecten. Maar denk maar niet dat je na een jaar ofzo aan verschillende projecten gewerkt te hebben nog weet welke functies etc je voor een bepaalde klasse nodig hebt. Het is gewoon handig om te gebruiken als handigheidje
Offline Stijn - 14/08/2007 14:59
Avatar van Stijn PHP expert Een interface maken voor één class maken dat door jou alleen geschreven wordt is zielig, zinloos. Wat marten zegt klopt. Kijken we eens naar Zend Framework. Daarin staan ook tal van interfaces. Stel dat ik het framework een persoonlijke touch wil geven (zeg aan het Zend View). Dan ga ik ook de interface (of abstract) class moeten gebruiken zodat er geen fouten gebeuren in het framework. Dus hier hebben we te maken met een grote groep, namelijk de wereldbevolking 
Offline ArndJan - 14/08/2007 16:43
Avatar van ArndJan PHP interesse een interface is een 100% abstracte implementatie en een abstracte classe hoeft niet 100% abstract te zijn!

Klinkt misschien een beetje raar maar zo denk ik er over.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.212s