Schopje in de goede richting nodig

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

John Cena

John Cena

04/10/2013 15:57:12
Quote Anchor link
Dames, Heren,

class database extends bootstrap
class kenteken extends bootstrap

Vrij logisch dat ik vanuit kenteken niet $this->db->query($sql); kan doen.

MAAR, als ik in bootstrap het volgende doe in mijn constructor:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if(!class_exists('Database')){
                include_once('/var/www/KosLib/config/database.php');
                $this->db = new Database();


Waarom werkt het dan alsnog niet?
 
PHP hulp

PHP hulp

27/11/2024 21:09:08
 
NOLot -

NOLot -

04/10/2013 16:02:11
Quote Anchor link
Geen idee, wat is je foutmelding? Het kan zijn dat je database.php ergens anders al geinclude hebt. Probeer het anders zo te doen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
if(!class_exists('Database')){
                include_once('/var/www/KosLib/config/database.php');
}
$this->db = new Database();


Je doet alleen maar new Database op het moment dat class_exists false geeft, maar volgens mij wil je dat altijd doen
 
Ozzie PHP

Ozzie PHP

04/10/2013 16:06:00
Quote Anchor link
2 Dingen die me opvallen...

1) class database extends bootstrap en class kenteken extends bootstrap. Hiermee zeg je dus dat de database en het kenteken een bootstrap zijn. Dat lijkt me absoluut niet te kloppen.

2) if(!class_exists('Database')).... Waarom gebruik je geen autoloader? Dan heb je dit soort constructies helemaal niet nodig. Als een class dan niet is geladen, gebeurt dit automatisch.
 
John Cena

John Cena

04/10/2013 16:11:03
Quote Anchor link
Ozzie,
1) dat klopt waarschijnlijk ook niet, echter ik zie niet in hoe ik het anders moet doen. Zit de hele middag al op dit probleem te staren en dan raak je het overzicht kwijt. Vandaar ook de titel van mijn topic :)
2) Autoloader klinkt goed, welke richting moet ik op?

NOLot-, bedankt, redeclaren van een class geeft me zowieso een foutmelding dus lijkt me onhandig om buiten de if te halen.
 
Ozzie PHP

Ozzie PHP

04/10/2013 16:14:26
Quote Anchor link
1) Dit moet je dus eerst op orde zien te krijgen, want hoe ik het nu zie ben je even compleet de weg kwijt en doe je dingen die echt niet kloppen.

2) Hier wat info betreffende autoloading: http://php.net/manual/en/language.oop5.autoload.php

Als je even duidelijke uitlegt wat je bedoeling is en waar je dan op vastloopt, is er vast wel iemand die je inderdaad in de juiste richting kan helpen. Tot die tijd zou ik even een pauze nemen... :)
 
John Cena

John Cena

04/10/2013 16:19:28
Quote Anchor link
Ik wil eigenlijk gewoon een klein frameworkje maken voor intern. Ik wil daarbij altijd de beschikking hebben over de database class en wil classes die ik niet altijd gebruik niet autoloaden maar enkel loaden als ik ze nodig ben.

Eigenlijk is dat alles! :)
 
NOLot -

NOLot -

04/10/2013 16:52:48
Quote Anchor link
Autoloaden = lazy loaded. Oftewel ze worden alleen maar geinclude zodra je ze nodig hebt
 
Wouter J

Wouter J

04/10/2013 16:53:47
Quote Anchor link
En waarom laat je ze beiden bootstrap extenden?
 
John Cena

John Cena

04/10/2013 17:05:14
Quote Anchor link
Omdat ik dan de functies van de bootstrap ook allemaal heb en ik dus vanuit de code die ik gebruik gewoon de class die ik nodig ben kan includen.

En, dat is dus een super bad practice, vandaar dat ik hier kom :)
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 17:06:33
Quote Anchor link
Chi Lion op 04/10/2013 16:19:28:
Ik wil daarbij altijd de beschikking hebben over de database class en wil classes die ik niet altijd gebruik niet autoloaden maar enkel loaden als ik ze nodig ben.

Zoals NOLot zegt: dáárvoor is de autoloader uitgevonden. Die laadt automatisch wat je nodig hebt, wanneer je het nodig hebt.
 
John Cena

John Cena

04/10/2013 17:11:38
Quote Anchor link
Ja, dat begrijp ik. Moet ik dan dus altijd de bootstrap laden en functies van daaruit loaden?
Stel dat ik vanuit een los bestand van de class kenteken dan functie checkNumbers wil gebruiken, hoe gaat dat dan?

include bootstrap
$bt = new bootstrap();
$bt ->kenteken->checkNumbers();

Zoiets?

Neem aan dat bootstrap dan kenteken zelf laadt?
 
NOLot -

NOLot -

04/10/2013 17:12:35
Quote Anchor link
Je zit wel in de goede richting ;)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$bt = new bootstrap(new kenteken());
$bt->getKenteken()->checkNumbers();


Zoiets

Edit: een autoloader is ontzettend simpel te maken, kijk naar dit voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
spl_autoload_register(function($clazz) {
    if(file_exists($clazz .'.php')) include $clazz .'.php';
});

?>


Stop dit als autoload.php in dezelfde folder waar al je classes staan, en je hoeft alleen nog maar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
require 'autoload.php';
te doen en dan kun je gewoon al je classes aanroepen
Gewijzigd op 04/10/2013 17:19:26 door NOLot -
 
John Cena

John Cena

07/10/2013 08:01:01
Quote Anchor link
En als ik nou vanuit de kenteken class de database wil benaderen.

Declareren in bootstrap als $this->db = new Database;

Benaderen in kenteken als ?
 
Ward van der Put
Moderator

Ward van der Put

07/10/2013 10:01:46
Quote Anchor link
Chi Lion op 07/10/2013 08:01:01:
En als ik nou vanuit de kenteken class de database wil benaderen.

Declareren in bootstrap als $this->db = new Database;

Benaderen in kenteken als ?


Dat kan... als je in de bootstrap al een databaseverbinding wilt openen en die vervolgens wilt doorgeven aan alle klassen die de databaseverbinding nodig hebben.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
// Databaseverbinding openen
$dbh = new Database();
// Databasehandle meegeven aan de klasse Kenteken
$kenteken = new Kenteken($dbh);
?>


Je kunt het openen van de databaseverbinding echter ook uitstellen door de databaseverbinding pas in klasse Kenteken te openen.

Dat is een keuze. Hebben andere klassen dezelfde databaseverbinding nodig? En heeft de klasse Kenteken altijd meteen een geopende databaseverbinding nodig? Is het antwoord op beide vragen "nee", dan zou ik de klasse Kenteken het eigen databaseverkeer intern laten afhandelen.
 
John Cena

John Cena

07/10/2013 10:24:55
Quote Anchor link
Beide antwoorden zijn ja.

Ik heb nu het volgende:

Bestand dat 'framework' nodig is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

//@author Chilion Snoek <c.snoek@******.nl>

require_once '../../index.php';


if($_POST['submit'] == "Vraag op"){
    print_r($_POST);
    
    $KosC->db->query('koeien');
}


?>


<form action="#" method="POST" >
    <label for="sysNr">Systeemnummer</label><input type="text" name="sysNr" id="sysNr" /><br />
    <label for="debNr">Debiteurnummer</label><input type="text" name="debNr" id="debNr" /><br />
    
    <input type="submit" value="Vraag op" name="submit" />
</form>


Vervolgens required die dus index.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

error_reporting(E_ALL);
//@author Chilion Snoek <c.snoek@******.nl>


require_once 'core/KosController.php';

$KosC = new KosController();
?>


Die initieert dus de basecontroller zeg maar.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
34
35
<?php

//@author Chilion Snoek <c.snoek@******.nl>

class KosController
{
    public $db;
    
    function
__construct()
    {

      
        //require standard classes file.
 
       require('../../config/database.php');
       $this->db = new Database();
        
    }

    function
__autoload($className)
    {

        
        if(file_exists('../controllers/'.$className . '.php')) {
            require_once('../controllers/'.$className . '.php');    
        }

        
        else {
            throw new Exception("Unable to load $className.");
        }
    }
    
    
    
  
}

?>


KosController haalt dus de DB op, in de DB zit de volgende functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
function query($sql, $database = null)
    {

        exit('query gestart?');
        $result = mysqli_query($this->connect($database), $sql);
        
        return mysqli_fetch_object($result);
        
    }

?>


Ik krijg nu keurig op mijn scherm 'query gestart' terug.
maw, ea werkt.

Echter, is dit zoals het hoort? Netjes, veilig en vooral "zoals het hoort"?
Gewijzigd op 07/10/2013 10:43:15 door John Cena
 
Wouter J

Wouter J

07/10/2013 10:48:33
Quote Anchor link
ik mis elke vorm van foutafhandeling en de autoload functie (het is geen method) hoort niet in een klasse.

Tevens heb je een front controller die de database aanmaakt en deze doorgeeft aan de controller, de controller moet niet zelf een database aanmaken.
 
John Cena

John Cena

07/10/2013 10:55:40
Quote Anchor link
Foutafhandeling ontbreekt inderdaad nog. Nog niet ingebouwd ivm niet weten of dit zo goed is.
Kun je :
Quote:
Tevens heb je een front controller die de database aanmaakt en deze doorgeeft aan de controller, de controller moet niet zelf een database aanmaken.


uitleggen?
 
NOLot -

NOLot -

07/10/2013 12:17:29
Quote Anchor link
Lees anders eens deze reeks artikelen eens door: http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1

Goede uitleg over het starten van een framework. Het uiteindelijke doel is om wat componenten van Symfony te gebruiken, maar hij geeft ook goede uitleg over hoe de structuur van een (goed) framework in mekaar zit
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.