Schopje in de goede richting nodig
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)
1
2
3
2
3
if(!class_exists('Database')){
include_once('/var/www/KosLib/config/database.php');
$this->db = new Database();
include_once('/var/www/KosLib/config/database.php');
$this->db = new Database();
Waarom werkt het dan alsnog niet?
Code (php)
1
2
3
4
2
3
4
if(!class_exists('Database')){
include_once('/var/www/KosLib/config/database.php');
}
$this->db = new 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
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.
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.
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... :)
Eigenlijk is dat alles! :)
Autoloaden = lazy loaded. Oftewel ze worden alleen maar geinclude zodra je ze nodig hebt
En waarom laat je ze beiden bootstrap extenden?
En, dat is dus een super bad practice, vandaar dat ik hier kom :)
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.
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?
Zoiets
Edit: een autoloader is ontzettend simpel te maken, kijk naar dit voorbeeld:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
spl_autoload_register(function($clazz) {
if(file_exists($clazz .'.php')) include $clazz .'.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 te doen en dan kun je gewoon al je classes aanroepen
Gewijzigd op 04/10/2013 17:19:26 door NOLot -
Declareren in bootstrap als $this->db = new Database;
Benaderen in kenteken als ?
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 ?
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)
1
2
3
4
5
6
2
3
4
5
6
<?php
// Databaseverbinding openen
$dbh = new Database();
// Databasehandle meegeven aan de klasse Kenteken
$kenteken = new Kenteken($dbh);
?>
// 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.
Ik heb nu het volgende:
Bestand dat 'framework' nodig is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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>
//@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)
1
2
3
4
5
6
7
8
9
10
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();
?>
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)
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
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.");
}
}
}
?>
//@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)
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
Tevens heb je een front controller die de database aanmaakt en deze doorgeeft aan de controller, de controller moet niet zelf een database aanmaken.
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?
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
Lees anders eens deze reeks artikelen eens door: 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