Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Framework met meerdere classes

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

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 28-11 01:05
Ik ben bezig met een site, en daar wil ik een fatsoenlijk framework aan hangen die bestaat uit meerdere classes (mailer, db, template, enzovoort).

Omdat ik deze classes niet allemaal in wil laden, terwijl ik mss alleen maar de mailer-class nodig heb, zoek ik naar een oplossing om de classes wel vantevoren te includen, maar pas te instantieren zodra ik ze aanroep met bijv
PHP:
1
$cmex->db->query('blaat');


Op dat moment wil ik pas een instantie van de db class maken, dus
PHP:
1
 $db = new database;


Hoe kan ik dit het beste aanpakken?

(Ik heb natuurlijk al eens rondgekeken op google enzovoort, maar ben niet bij een mooie oplossing gekomen)

[ Voor 8% gewijzigd door _eXistenZ_ op 21-09-2007 20:13 ]

There is no replacement for displacement!


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:04

orf

Juist includen zonder te gebruiken is zonde van resources. In PHP5 kun je http://nl.php.net/autoload gebruiken om classes pas te includen op het moment dat je ze nodig hebt.

Voor classes als je db-abstractie wil je waarschijnlijk een singleton gebruiken.

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Volgens mij maakt het dmv optimizers eigenlijk geen donder uit, en is de autoload functie de simpelste om te gebruiken. En als je niet expliciet $iets = new Iets($par1, $par2) wil doen steeds, heb je alleen de keuze om iets te doen wat op een singleton lijkt of het is.

Maar ik wil je niet laten schrikken: er zijn al fatsoenlijke frameworks in PHP te vinden. Gratis.

iOS developer


  • mithras
  • Registratie: Maart 2003
  • Niet online
Hoe groot verwacht je dat het framework wordt? Ik heb een modulair cms (valt ook te zien als framework) waar naast een plugin object met 21 plugins in zich, ook nog een database object en een object met common functions wordt geïnstantieerd.

Hierbij zullen alle plugins bijvoorbeeld in ieder geval al een keer hun eigen settings uit de database halen. En dit draait vooralsnog als een zonnetje. Je moet je framework niet overschatten en voor de nanosecondes gaan optimaliseren.

Het is uiteraard goed om er rekening mee te houden, ik zou wel adviseren om reeel te blijven. Een mail object zal nooit veel resources vreten, een database object zal je zo vaak nodig hebben dat het initialiseren sowieso een goed idee is. Je zal waarschijnlijk nog eens 95% van je pagina's uitpoepen via een template, dus zoiets is ook slim om gewoon aan te maken.

Dus wat ben je eigenlijk van plan om te optimaliseren, en hoeveel wil je eruit halen (tijd & moeite om te optimaliseren vs. snelheid waarmee script geparsed gaat worden)?

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

class cmex {
    protected $db = null;
    
    
    public function __get($name) {
        if($name == 'db') {
            if($this->db === null)
                $this->db = new database();
            return $this->db;           
        }
    }
}

?>


Zoiets lijkt me wat je dan wilt...

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


  • daniëlpunt
  • Registratie: Maart 2004
  • Niet online

daniëlpunt

monkey's gone to heaven

Om verder te gaan op het patroon van OxiMorom:

PHP:
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
class cmex {
    protected $members;
    private static $instance;

    public function __construct() {
        $this->members = array();
    }

    public function getInstance() {
        if(!self::$instance)
            self::$instance = new self;
        return self::$instance;
    }

    private function __get($name) {
        if(isset($this->members[$name]))
            return $this->members[$name];
        return null;
    }
    
    public function __set($name, $value) {
        if(!isset($this->members[$name]))
            $this->members[$name] = $value;
    }

    public function __unset($name) {
        unset($this->members[$name];
    }
}

$cmex = cmex::getInstance();
$cmex->db = new Database();
$result = $cmex->db->query("SELECT * FROM..");


Dus overal waar je Cmex nodig hebt roep je aan met cmex::getInstance(); en je beschikt over alle objecten die je nodig hebt. :)

Dit is dus het Singleton pattern, en maak gebruik van zo geheette Magic Methods.

[ Voor 31% gewijzigd door daniëlpunt op 27-09-2007 10:51 . Reden: Te vroeg op 'verstuur bericht' geklikt. ]


  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Het is alleen niet zo netjes om je database object buiten de class aan te maken. Nu weet je in je cmex class niet echt of hij uberhaupt aangemaakt is of niet.

Ik zou de database class dan aanmaken in de constructor (wanneer heb je die nou niet nodig) en hem afsluiten in de destructor.

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Er worden hier nu wel allerlei oplossingen aangedragen, maar ik denk dat de *waarom* wil je dit vraag hier het belangrijkste is..

WAAROM wil je dit in hemelsnaam? Wat denk je er mee te bereiken?
Een __autoload() functie doet precies wat jij nodig hebt, het laadt een class pas in het geheugen als ie nodig mocht zijn, waardoor je er ook geen singleton van hoeft te maken (Singletons zijn in php imo ook alleen nuttig voor database classes)

Als het antwoord op de Waarom vraag het de woorden "Ja maar' en 'PHP 4' bevat adviseer ik je toch echt php5 te gaan gebruiken omdat PHP4 uitgefaseerd wordt.

Stop uploading passwords to Github!


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
SchizoDuckie schreef op donderdag 27 september 2007 @ 16:24:
WAAROM wil je dit in hemelsnaam? Wat denk je er mee te bereiken?
Een __autoload() functie doet precies wat jij nodig hebt, het laadt een class pas in het geheugen als ie nodig mocht zijn, waardoor je er ook geen singleton van hoeft te maken (Singletons zijn in php imo ook alleen nuttig voor database classes)
Nee __autoload word aangeroepen wanneer je een instantie maakt van een class, en het probleem met een Registry als deze is dat die instanties vooraf aangemaakt worden en je niet zeker weet of je ze wel gaat gebruiken. Vandaar (waarschijnlijk) dat de TS een vorm van lazy loading wil gebruiken.

Wat Singletons hier nu weer mee te maken hebben is me niet helemaal duidelijk want die is nergens gepost (ook de post van super-muffin niet); het is een implementatie van een Registry en in dat geval is het vrij logisch dat je maar een instantie wilt hebben in je Registry maar dat maakt het nog geen Singleton. Het is immers nog steeds gewoon mogelijk om (buiten het Registry om) een instantie te maken van de class die je wilt gebruiken; een Singleton gaat dat expliciet tegen. Daar naarst vind ik het een beetje cru om te zeggen dat je Singletons enkel nuttig vind voor database classes maar dat is een andere discussie.

Verwijderd

In eerste instantie hang je je site aan een framework (Raamwerk), dat is je hart en nieren van je site.
Als je er een zelf wilt maken is rondkijken bij de gratis verkrijgbare frameworks (bv CakePHP) een aardig idee en naar de verschillende design patterns te kijken (Bijvoorbeeld MVC).

Met die aanpak/kennis zal een autoload of object die require_once doet de aanpak zijn.

Als je antwoord "ja" is op de vraag "singletons zijn voor databases" dan is het tijd om een boek te kopen over OO design patterns.

___________________________________________________________________________________
Nee Joomla is geen framework, het is een pakjeshuis van sinterklaas.

[ Voor 15% gewijzigd door Verwijderd op 10-10-2007 15:22 ]

Pagina: 1