Toon posts:

[PHP]OOP

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben net begonnen met OOP in PHP, dus met classes. Ik heb hierover alleen nog wat vragen.

Als je een class hebt heb je verschillende functies en variabelen die gelden in de hele class. Is het mogelijk om bepaalde van deze variabelen en functies buiten de interface te houden? Dus dat je vanuit je script niet die functies of variabelen kan aanroepen?

Ik ben van plan om een database class te maken die postgesql en mysql ondersteunt. Ik heb al wel gelezen dat er abstraction layers zijn die dit al kunnen maar dat deze niet echt snel zijn. Als ik zo'n database class kan maken hoe moet ik de structuur dan maken om postgesql en mysql te gebruiken?

Maak ik dan een algemene function en aparte functies per database bijvoorbeeld:
PHP:
1
<?class Database{  var $dbName;  function doQuery($sql)  {    if ($this->dbName == "MySQL") $this->queryMySQL($sql);    elseif ($this->dbName == "PostgreSQL") $this->queryPostgreSQL($sql);  }  function queryMySQL($sql)  {  ...  }  function queryPostgreSQL($sql)  {  ...  }}?>

Of kan ik dit net zo goed allemaal in dezelfde functie houden?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat je graag wilt heet in java private/protected/public etc...
Wat inhoud dat je functies alleen vanuit je class aan kan laten roepen, of vanuit de zelfde package etc.

Helaas kent php daar nog (?) geen ondersteuning voor.
Opzich is het wel degelijk een goede aanpak, maar voor deze abstraction zou je misschien beter naar het principe van sub/superclasses kunnen kijken. (Wat ook beter in java werkt overigens ;) )

Verwijderd

Topicstarter
Volgens mij is dat java best interessant :).

Dus je bedoelt dat je 3 classes hebt. 1 voor de interface, 1 voor mysql en 1 voor postgresql?

Kan je dan in je interface class een nieuw object maken (dus de postgresql of mysql)?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nee, dat moet je anders zien.

Je maakt een superclass (je interface) en leid daar een class voor postgresql en mysql van af (je subclasses).

Vervolgens initialiseer je gewoon bijv met:
$database = new PostgresDB(); een database, die dit keer toevallig een postgresDB is, andere keren een mysql DB.

Helaas biedt php hier geen mooie support voor, maar met het class-based idee zoals in java gaat dat erg mooi.

Die twee subclasses zijn dus gemaakt 'met de superclass' als voorbeeld (en die functies die algemeen zijn kan je dan in je superclass laten).

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

In PHP geldt wel dat mensen functies die met een _ beginnen niet van buiten de class mogen aanroepen.

Rustacean


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Afgezien van dat php geen private/public vars en functies ondersteund (wat ACM dus zei), is er een ongeschreven regel welke zegt dat de naam van deze vars en functies met een '_' beginnen.

dus:
PHP:
1
<?class fiets {  //--- public  var $snelheid = 0;  //-- private  var $_versnellingen = 0;  //--- etc..}?>


[edit] kmoet echt sneller leren tiepen..
[edit2] topix php-code editten isnie leuk..

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

Op woensdag 20 maart 2002 22:12 schreef Manuzhai het volgende:
In PHP geldt wel dat mensen functies die met een _ beginnen niet van buiten de class mogen horen aanroepen.

Klaar voor een nieuwe uitdaging.


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Hmmz.. ik ben niet zo'n OOP held hoor (gebruik het alleen in PHP :) ) maar was het volgens de 'OOP regels' niet zo dat je buiten de class in principe niets met de classevariabelen te maken hebt..? Dus dat je niet $Object->var gebruikt maar $Object->getVar() :?

On track


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 21 maart 2002 00:11 schreef WouZz het volgende:
Dus dat je niet $Object->var gebruikt maar $Object->getVar() :?
Dat is niet verplicht, maar vaak wordt dat wel als richtlijn aangehouden ja :)

Verwijderd

En wat is sneller? :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 21 maart 2002 00:35 schreef TeasZ het volgende:
En wat is sneller? :)
Wat wil je dan met wat vergelijken :?

Verwijderd

$Object->var of een functie $Object->getVar()

Verwijderd

Op donderdag 21 maart 2002 01:07 schreef TeasZ het volgende:
$Object->var of een functie $Object->getVar()
$Object->var

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

Op donderdag 21 maart 2002 01:07 schreef TeasZ het volgende:
$Object->var of een functie $Object->getVar()
het is sneller maar vrijwel verwaarloosbaar.

Probeer maar een for-loop die gewoon bv 300x dit doet:
$var = $object->var;
vs:
$var = $object->getvar();

waarbij getvar() enkel return $this->var; geeft... ik gok dat 't heeel weinig scheelt.

Klaar voor een nieuwe uitdaging.


Verwijderd

Topicstarter
Ik vind het via een functie een stuk mooier om variabelen door te geven. Je kan dan ook meteen in die functie een controle uitvoeren op de invoer.

Nog even over dat sub en superclasses waar ACM het over had. Bedoel jij hiermee 'extends' in PHP? Dus dat je dit krijgt:
PHP:
1
<?class Database{  var $dbServerIP;  var $dbServerPort;  ....  var $connected = FALSE;  function setConnection ($dbServerIP, $dbServerPort...)  {    $this->dbServerIp = $dbServerIP;    $this->dbServerPort = $dbServerPort;    .....  }}class PostgreSQL extends Database{  var $dbConnection;  function connect()  {    $this->dbConnection = pg_connect("host=". $this->dbServerIP ." port=". $this->dbServerPort....);    $this->connected = TRUE;  }}$database = new PostgreSQL;?>

Is dit wat jij bedoelt of is het iets totaal anders? Ik heb eigenlijk verder weinig gevonden in de php manual. Kan je anders ff een voorbeeldje geven of is het alleen mogelijk in java.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 21 maart 2002 18:19 schreef Xenith het volgende:
Nog even over dat sub en superclasses waar ACM het over had. Bedoel jij hiermee 'extends' in PHP?
Jup, zoiets.

Verwijderd

Topicstarter
Op donderdag 21 maart 2002 18:25 schreef ACM het volgende:

[..]

Jup, zoiets.
Ah oke bedankt voor de info. Mij lijkt dit ook wel een goede oplossing omdat je zo makkelijke nieuwe extends kan schrijven voor verschillende databases.

Ik heb voorlopig weer wat te doen :).
Pagina: 1