[php] OOP opzet / ontwerp probleempje *

Pagina: 1
Acties:
  • 238 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoihoi. Kort geleden ben ik begonnen met OOP en ondanks dat ik er aan het begin weinig van snapte, gaanderweg denk ik beter te begrijpen hoe OOP in elkaar steekt. Maar helaas, ik zit nu al een paar dagen vast en kom er echt niet meer uit.

Ik heb nu 3 classes. 1. core, 2. initialize en 3 userData.

In initialize wordt alles klaar gemaakt voor gebruik. Config variables uitlezen, database connectie opzetten etc. Vervolgens, aan het eind van de initialize functie maak ik een verwijzing naar de userData class:

$this->loadClasses ( "userdata" );
$this->user = new userData($this->db);

En vervolgens roep ik op deze manier de functies aan:

$this->userData[userrestrictions] = $this->user->getUserRetrictions( );

Werkt allemaal leuk en aardig, op 1 ding na: de $db( $this->db = new mySQLWrapper; ), eerder in initialize opgezet, wordt niet herkend in de gerequirde class van userData. Mijn vraag is dus: hoe krijg ik de variables etc. die ik in initialize heb gemaakt, beschikbaar in de gerequirde class. Extends (bij userData) kan niet, dat resulteert in een alsmaar ladende pagina. Ik heb dingen geprobeerd met ::, maar ook daar kom ik niet verder mee. Kortom: ik zit al een paar dagen vast. Ik hoop dat iemand me verder kan helpen.

Voor de hele code van initialize en core: http://www.jovd.com/includes/test2.txt
Ik hoop dat ik duidelijk ben. Alvast bedankt voor de moeite. :)

[ Voor 6% gewijzigd door drm op 26-03-2003 14:01 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Als je wilt OO leren, dan moet je gebruik maken van een taal die OO voor 100% ondersteunt, zoals C#, Java, C++. Niet met PHP die wel classes enzo heeft, maar eigenlijk niet OO is.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Zoals al gezegd, als je echt OO wil leren neem dan Java oid.

Maar goed, om even op je andere vraag in te gaan:

Zo te zien geef je je database object door aan de constructor van userData.
Kan je die constructor even hier posten?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil mijn database object(en andere variablen/constanten) doorgeven aan de class van userData. Bijv. deze functie(die ik als voorbeeld aanhaalde, en waarin een testquery staat: let dus net op de query zelf, die is niet van belang) van userData:
PHP:
1
2
3
4
5
6
7
function getUserRetrictions ( ) {
    $test = $this->db->queryFirst("
        SELECT * 
        FROM JOVD_news 
        WHERE news_id='$usergroups'
    ");
}

Ik wil dus in deze functie het db object gebruiken die ik in initialize gedefineerd heb.

Om nog in te gaan over de keuze van de programeertaal. Ik heb al vaker gehoord/gelezen dat ik beter in java verder kan gaan, maar helaas is dit onmogelijk. Ik werk namelijk samen met 5 andere php programeurs in een commissie, en die zouden het me niet in dank afnemen als ik beslis het roer om zou gooien naar bijv. java.

Acties:
  • 0 Henk 'm!

Verwijderd

PHP5 zou alle Object-Oriented Design Patterns aankunnen, maar ik denk dat er nog héél veel ontwikkeld moet worden...zoek maar even op de specificaties van de ZEND2 engine
Momenteel is het echt af te raden om (veel) objecten te gebruiken in je PHP (tenzij je echt een goede reden hebt), omdat het véél geheugen slorpt enzo...qua performance ook zeer traag.

Acties:
  • 0 Henk 'm!

  • MAZZA
  • Registratie: Januari 2000
  • Laatst online: 17-09 16:30

MAZZA

Barbie is er weer!

Ik kwam vanmiddag deze tegen: The Object Oriented Evolution of PHP - By Zeev Suraski. Misschien wel leuk voor je :)
Behandelt het OOP model dat in PHP 5 (Zend engine 2) geintroduceerd word.

/edit: En deze is ook wel leuk voor de liefhebber:

"Zend Engine version 2.0: Feature Overview and Design".

[ Voor 43% gewijzigd door MAZZA op 26-03-2003 22:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik het dus goed begrijp is datgene wat ik wil (nog) niet mogelijk in php? Lastig, dat wordt dan lang zoeken om een andere goede oplossing te vinden. :-/

Bedankt trouwens voor de informatie! :)

Acties:
  • 0 Henk 'm!

Verwijderd

Kom kom je kan in PHP echt wel heel wat OOP principes toepassen. Het grootste probleem is eerder dat de meesten ze zelf toch niet echt kennen dus dan pas je het ook niet goed toe. Nogal makkelijk om zomaar de schuld op PHP te steken.

Maar ok PHP's object model is niet echt ideaal en ja ik mis veel mogelijkheden uit Java. Als je even probeert en een aantal regels vastlegt kan je toch nog wel wat doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 27 March 2003 @ 00:48:
Kom kom je kan in PHP echt wel heel wat OOP principes toepassen. Het grootste probleem is eerder dat de meesten ze zelf toch niet echt kennen dus dan pas je het ook niet goed toe. Nogal makkelijk om zomaar de schul op PHP te steken.

Maar ok PHP's object model is niet echt ideaal en ja ik mis veel mogelijkheden uit Java. Als je even probeert en een aantal regels vastlegt kan je toch nog wel wat doen.
Als jij het OOP principe voor mijn probleem wel kent zou dat geweldig zijn. ;) Ben nu namelijk al bezig met het doorgeven van de variables als parameters in de functies, maar dat is ontzettend omslachtig en gaat eigenlijk voorbij aan het doel van OOP. Althans, dat zegt mijn gevoel.

Acties:
  • 0 Henk 'm!

  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03 09:11
Maak in de parent een functie aan die het object kan retourneren. Bijvoorbeeld:
PHP:
1
2
3
4
function get_object($name)
{
    return($this->$name);
}


doe dan in de childclass:
PHP:
1
$this->db = parent::get_object('db');


Zo werkte het bij mij ook, dus ik neem aan dat dit bij jou ook werkt. Het is misschien lelijk, maar het doet tot php5 er is wat het moet doen.

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Probleem is alleen dat de userData class aangeroepen wordt in de initialize class, en ik dus in de userData class initialize niet kan extenden, en geen parent:: kan gebruiken. Misschien is mijn opzet wel totaal verkeerd...

Acties:
  • 0 Henk 'm!

Verwijderd

Wel een leuk beginnetje als je php als OO taal wilt gebruiken:

http://www.jphplib.org

Acties:
  • 0 Henk 'm!

Verwijderd

1.
Waarom zou je moeten extenden. Wat je nu doet kan ook heel goed (db als argument in de constructor)

2.
Wat is nou precies je probleem. "Hij wordt niet herkend." Wat betekent dat. Hij doet het niet? Krijg je vreemde errors?
Zoja, laat eens wat errors zien.

edit:
d/t issues :)

[ Voor 9% gewijzigd door Verwijderd op 27-03-2003 10:09 ]


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
/* ### CONSTRUCTOR ###
    Parameters:
        $baseConfig: base config variables
        $table: table variables
        $dbInfo: database variables
        $config: config variables
        $forumConfig: forum variables*/ 
function initialize ( ) 
{           
    // ### LOAD BASE CONFIG VARIABLES ###
    $this->loadBaseConfig( $table, $dbInfo, $baseConfig ); // Load $table, $dbinfo and $baseConfig data

Je hebt het daar over parameters, maar ik zie geen parameters in je constructor!

Daarnaast geef je die variabelen aan loadBaseConfig, terwijl die nog niet eens bestaan (jaja, het kan wel maar doe het nou gewoon niet).

[ Voor 15% gewijzigd door Verwijderd op 27-03-2003 11:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 27 March 2003 @ 10:08:
1.
Waarom zou je moeten extenden. Wat je nu doet kan ook heel goed (db als argument in de constructor)

2.
Wat is nou precies je probleem. "Hij wordt niet herkend." Wat betekent dat. Hij doet het niet? Krijg je vreemde errors?
Zoja, laat eens wat errors zien.

edit:
d/t issues :)
1. Ik zou vanuit userData willen extenden omdat ik anders geen parent:: kan gebruiken om de objecten aan te spreken van de class.

2. Mijn probleem is dat ik in initialize diverse objecten/variablen creeer en die in andere classes ook beschikbaar wil hebben. Ik laad echter vanuit initialize ook de userData class aan, en kan daardoor vanuit de userData class niet meer initialize extenden en met parent:: de objecten aanspreken.

Vreemde error's krijg ik niet, een error uiteraard wel maar die is simpel te verklaren, het object wordt niet herkend:

"Fatal error: Call to a member function on a non-object ... "

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 27 March 2003 @ 10:58:
PHP:
1
2
3
4
5
6
7
8
9
10
11
/* ### CONSTRUCTOR ###
    Parameters:
        $baseConfig: base config variables
        $table: table variables
        $dbInfo: database variables
        $config: config variables
        $forumConfig: forum variables*/ 
function initialize ( ) 
{           
    // ### LOAD BASE CONFIG VARIABLES ###
    $this->loadBaseConfig( $table, $dbInfo, $baseConfig ); // Load $table, $dbinfo and $baseConfig data

Je hebt het daar over parameters, maar ik zie geen parameters in je constructor!

Daarnaast geef je die variabelen aan loadBaseConfig, terwijl die nog niet eens bestaan (jaja, het kan wel maar doe het nou gewoon niet).
Gelijk heb je, "parameters" moet "variables" worden. Een beschrijving van de hoofdvariabelen in de constructor.

Ik geef die variabelen niet door, maar haal ze er juist uit met references(ook iets wat ik trouwens pas kort geleden door heb gekregen. ;)). Maar inderdaad, ik zou al mijn variabelen moeten declareren. Ik heb dan ook de error_reporting op ALL gezet en ben aan het kijken of ik alle error's weg kan werken. Het is wel even wennen, maar vanuit OOP gezien wel zo netjes.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu trouwens gekozen om de variablen en constructors door te geven aan een functie in de class(moet eigenlijk nog in de constructor komen). Op deze manier werkt het, maar volgens mij is het alles behalve netjes.
PHP:
1
2
3
4
5
6
7
function callUserClass ( ) 
{
    $this->loadClasses ( "userdata" );
    $this->user = new userData( );
        
    $this->user->getUserData( $this->config, $this->db, $this->forumdb, $this->table );
}

Ik heb trouwens ook nog geprobeerd een functie te maken in de core class:
PHP:
1
2
3
4
function newObject ( $objectName, $className )
{
    $this->$objectName = new $className;
}

met deze functie (naar aanleiding van Tum | Mut):
PHP:
1
2
3
4
function getObject ( $objectName )
{
    return $this->$objectName;
}

Waarbij ik in in initialize zo het object maakte:
PHP:
1
parent::newObject('db', 'mySQLWrapper');

En hoopte in een andere class dan initialize zo het object op te vragen:
PHP:
1
$this->db = parent::getObject('db');

Helaas werkt dat niet, omdat het object schijnbaar niet beschikbaar wordt in de core class, maar enkel in de initialize class waarvanuit ik de functie aanroep. Zal wel heel logisch zijn, maar ik dacht dat het misschien wel kon werken. Gaanderweg leert men. :) Als ik trouwens vanuit een andere class het object opnieuw aanmaak(i.p.v. op te vragen), werkt hij wel en kent hij nog wel alle variables en functies die ik al eerder aan op dit object had losgelaten. Hoe zit dat precies? Ik zou namelijk zeggen dat het oude object overgeschreven zou worden.

[ Voor 8% gewijzigd door Verwijderd op 27-03-2003 12:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 27 maart 2003 @ 12:50:
Ik heb trouwens ook nog geprobeerd een functie te maken in de core class:
PHP:
1
2
3
4
function newObject ( $objectName, $className )
{
    $this->$objectName = new $className;
}
Volgens mij hoort dat zo (het blijft vies):
PHP:
1
2
3
4
function newObject ( $objectName, $className )
{
    $this->{$objectName} = new $className();
}

[ Voor 6% gewijzigd door Verwijderd op 27-03-2003 14:38 ]

Pagina: 1