PHP - Variabelen doen het niet in een ander bestand
Ik heb een eigen router class in php gemaakt. De router class include ik op de index.php waar ik ook alle routes toevoeg. Bijvoorbeeld zo
Ook heb ik een Model class voor al mijn database queries. Zoals in de code te zien, zie je dat ik het model object aanroep. Hoe kan het dat als ik het model object oproep doormiddel van Dat ik de $model variabel niet kan gebruiken in bijvoorbeeld een bestand wat ik met die router functie require?
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
36
37
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
36
37
<?php
require_once 'classes/route.php';
require_once 'classes/config.php';
require_once 'classes/model.php';
require_once 'functions.php';
require_once 'classes/validator.php';
$route = new Route();
$db = new Db();
$model = new Model();
$route->add('/', function(){
require_once 'pages/home.php';
});
$route->add('/tapijten', function(){
require_once 'pages/products.php';
});
$route->add('/product/\d+', function($model){
require_once 'pages/product.php';
});
$route->add('/contact', function(){
require_once 'pages/contact.php';
});
$route->add('/admin', function(){
require_once 'pages/admin.php';
});
$route->add('/login', function(){
require_once 'pages/test.php';
});
$route->submit();
?>
require_once 'classes/route.php';
require_once 'classes/config.php';
require_once 'classes/model.php';
require_once 'functions.php';
require_once 'classes/validator.php';
$route = new Route();
$db = new Db();
$model = new Model();
$route->add('/', function(){
require_once 'pages/home.php';
});
$route->add('/tapijten', function(){
require_once 'pages/products.php';
});
$route->add('/product/\d+', function($model){
require_once 'pages/product.php';
});
$route->add('/contact', function(){
require_once 'pages/contact.php';
});
$route->add('/admin', function(){
require_once 'pages/admin.php';
});
$route->add('/login', function(){
require_once 'pages/test.php';
});
$route->submit();
?>
In de product.php wat ik dus require in de index.php wil ik een query oproepen doormiddel van het $model variabel.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
require_once 'inc/header.php';
$uri = $_SERVER['REQUEST_URI'];
$pin = explode('/', $uri);
$id = $pin[3];
$product = $model->selectById($id, 'carpet');
$product = $product->fetch(PDO::FETCH_ASSOC);
?>
require_once 'inc/header.php';
$uri = $_SERVER['REQUEST_URI'];
$pin = explode('/', $uri);
$id = $pin[3];
$product = $model->selectById($id, 'carpet');
$product = $product->fetch(PDO::FETCH_ASSOC);
?>
waar in je andere thread is er ondersteuning voor objecten in de callbackfunctie? Noch in de add() methode noch in call_user_func() in de submit() methode worden parameters doorgegeven? In die code zit waarschijnlijk ergens de fout.
De $params in @Robs code hebben betrekking op de matches van URI's en hebben dus (?) volgens mij niets te maken met de "object parameters" die jij probeert door te geven.
Weet je ook zeker dat de juiste methode wordt uitgevoerd?
En De $params in @Robs code hebben betrekking op de matches van URI's en hebben dus (?) volgens mij niets te maken met de "object parameters" die jij probeert door te geven.
Weet je ook zeker dat de juiste methode wordt uitgevoerd?
Gewijzigd op 08/02/2018 04:39:55 door Thomas van den Heuvel
Wat je hier doet met /products klopt dus niet. De callback functie krijgt de matches uit de regex mee. Het feit dat je de parameter van de callback functie $model noemt betekent niet dat dat die $model van regel 10 is. Wil je het $model wel in de callback gebruiken, dan zul je 'm met 'use' mee moeten geven.
De params die ik in mijn aangepaste stukje code doorgeef aan de constructor komen uit de preg_match(). Wil je dat daar iets zinnigs in zit, dan zul je in de reg-ex groepering toe moeten passen (met haakjes):
Code (php)
1
2
3
4
5
2
3
4
5
$route->add('/product/(\d+)', function($params) use ($model){
//het ID zit nu in $params[1]
//$model bevat nu het op regel 10 aangemaakte Model
require_once 'pages/product.php';
});
//het ID zit nu in $params[1]
//$model bevat nu het op regel 10 aangemaakte Model
require_once 'pages/product.php';
});
Gewijzigd op 08/02/2018 06:50:48 door Rob Doemaarwat
Code (php)
1
2
3
4
2
3
4
<?php
$product = $model->selectById($id, 'carpet');
$product = $product->fetch(PDO::FETCH_ASSOC);
?>
$product = $model->selectById($id, 'carpet');
$product = $product->fetch(PDO::FETCH_ASSOC);
?>
Is $product zelf trouwens geen model en $model dan meer een mapper?
En waarom accepteert de selectById() niet alleen een $id maar ook de stirng 'carpet'? Die methode doet kennelijk twee verschillende dingen.
Er is ergens een $db in omloop, maar waar komt die dan terug in je code?
Je lijkt in $product->fetch(PDO::FETCH_ASSOC) PDO te gebruiken, maar waar is dan de $db gebleven?
voorbeeld:
index.php:
routes.php:
Is het zelfde als:
De kneep zit m in het feit dat de variabele $routes dus aangemaakt wordt in de functie something. Deze variabele bestaat dus ook enkel en alleen binnen de functie something en niet er buiten.
Ik dacht simpelweg dat als ik een variabel aanmaak in het hoofdbestand index.php dat hij dan gewoon te gebruiken is in een ander bestand dat wordt geinclude op de index.php omdat hij dan technisch gezien nog steeds op de index.php wordt geprint alleen dan tussen de html van het geinclude bestand.
Het gaat er dus om dat de variabele $routes binnen een function staat, wat inhoudt dat die variabele daarbuiten niet bekend is.