De 'scope' van een constante.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nkamp Kamp van de

nkamp Kamp van de

26/09/2013 17:50:23
Quote Anchor link
Hallo,

Ik zit met het probleem wat is de scope van een costante. Ik heb iets tegen een joomla site aangebouwd. Vanuit verschillende artikelen roep ik via PHP eigen stukken php code aan.
Ik gebruik daar oa. JPATH_SITE constante, die binnen Joomla is gedefinieerd. Dit werkt goed.

Echter nu heb ik ook een eigen stuk 'Beheer' gebouwd die dus los van Joomla staat en waarbinnen de JPATH_SITE constante niet bekend is.

Nu dacht ik maak ik zelf een defines.php.

Dit is mijn directory struktuur in het kort:

- domein.nl
- beheer
index.php session_start(), roept reguire_once(../defines.php).
aanmelden.php
- include
- etc.

In index.php. start ik de sessie en roep ik defines.php aan waar ik dan de contstante (NPATH_BEHEER) definieer van het path (_DIR_) naar beheer.
Via de index.php kom ik via een javascript redirect (window.location.href) in aanmelden.php.
Echter wanneer ik daar:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    if (!defined('NPATH_BEHEER')) {
        echo 'constant not defined!';
        }

?>

Waarom is de constante in mijn aanmelden.php niet bekend? Heeft dat met de sessie te maken? Wat doe ik fout?
Nico
 
PHP hulp

PHP hulp

22/12/2024 09:01:51
 
- SanThe -

- SanThe -

26/09/2013 18:46:06
Quote Anchor link
Als dat niet via index.php gaat zal je defines.php moeten includen in aanmelden.php.
 
Nkamp Kamp van de

nkamp Kamp van de

27/09/2013 16:45:01
Quote Anchor link
Ja, maar dat is net mijn vraag, mijn verwachting is dat als ik CONSTANT defninieer binnen de sessie, dat deze dan overal bereikbaar is. Dus als ik een volgend php script pagina aanroep dat ik dan de waarde van die constante eenvoudig kan uitvragen.

Nu zou ik dus in iedere php pagina mijn defines.php moeten includen.

Of klopt mijn gedachten gang niet?
Gewijzigd op 27/09/2013 16:45:45 door nkamp Kamp van de
 
Erwin H

Erwin H

27/09/2013 16:50:20
Quote Anchor link
Uiteraard. php begint bij elk request met een leeg geheugen. Alles wat in een vorig request is gedaan is vergeten. Als je een bestand dus niet include dan heeft php er geen weet van.
 
Nkamp Kamp van de

nkamp Kamp van de

27/09/2013 23:16:58
Quote Anchor link
Misschien een domme vraag maar wat is precies een nieuw request?
Ik bedoel in mijn geval tik je een url in. Dan ga je via de index.php door naar aanmelden.php (Ok is javascript 'window.location.href = "aanmelden.php", = front-end). Zie je dat als een nieuwe request? Ik verwacht niet omdat frond-end is, maar...

Vervolgens moet op aanmelden.php, je inlog gegevens invoeren. Als deze correct zijn ga ik naar de volgende pagina via stukje php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$Redirect
= "location: ".$Url;
header ($Redirect);  
?>

Dit is misschien een nieuwe request. Maar als ik in index.php de regel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
require_once(defines.php);
?>

opneem, dan is mijn verwachting dat in aanmelden.php de constante nog steeds bekend is en eigenlijk ook na aanmelden.php nog.

Ik lees ook in een boek:
"Constanten die je definieert in het hoofdgedeelte van een PHP script, zijn overal beschikbaar. Constanten hebben altijd een global scope.

Nu ik dit zo overneem stel ik mij de vraag wat is het hoofdgedeelte? Ik denk bij mij index.php, maar...?

Wat ik raar zou vinden en dat gebeurd volgens mij ook niet binnen Joomla, dat bij iedere pagina eigenlijk de defines.php moet includen. Dan zie ik hiervan niet echt het nut in.
Gewijzigd op 27/09/2013 23:18:49 door nkamp Kamp van de
 
Ozzie PHP

Ozzie PHP

27/09/2013 23:38:55
Quote Anchor link
Nkamp Kamp van de op 27/09/2013 23:16:58:
Misschien een domme vraag maar wat is precies een nieuw request?

Zodra er een nieuwe URL wordt aangeroepen, hetzij door zelf op F5 te drukken, of door een header uit te voeren, of door een link aan te klikken... is er sprake van een nieuw request.

Als je in pagina 1 een waarde 'defined' en je roept vervolgens via een header pagina 2 aan, dan is er sprake van een nieuw request. Het geheugen is dan weer leeg. Als je de waarde die je op pagina 1 hebt gedefined weer wilt gebruiken, zul je die dus opnieuw moeten definen. (Als je waardes wilt onthouden, dan kun je gebruik maken van sessie-variabelen.)

Bij iedere request begin je als het ware weer helemaal opnieuw.
Gewijzigd op 27/09/2013 23:39:51 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

28/09/2013 07:45:05
Quote Anchor link
Nkamp Kamp van de op 27/09/2013 16:45:01:
Ja, maar dat is net mijn vraag, mijn verwachting is dat als ik CONSTANT definieer binnen de sessie, dat deze dan overal bereikbaar is.

Constanten staan helemaal los van sessies. Maar je vraag is op zich wel logisch, want je kunt beide gebruiken om iets vast te leggen.

Als je een constante bij een volgend verzoek opnieuw wilt gebruiken, zul je die hetzij opnieuw moeten definiëren, hetzij opnieuw een include moeten uitvoeren van defines.php.
 
Erwin H

Erwin H

28/09/2013 08:36:31
Quote Anchor link
Nkamp Kamp van de op 27/09/2013 23:16:58:
Misschien een domme vraag maar wat is precies een nieuw request?
Ik bedoel in mijn geval tik je een url in. Dan ga je via de index.php door naar aanmelden.php (Ok is javascript 'window.location.href = "aanmelden.php", = front-end). Zie je dat als een nieuwe request? Ik verwacht niet omdat frond-end is, maar...

Elke keer dat de browser de server vraagt om data is het een request. Per pagina hab je al talloze requests.
Hoofdpagina -> request
CSS bestand laden -> request
javascript bestand laden -> request
paatje laden -> request
ajax data laden -> request
nieuwe pagina via een redirect -> request
nieuwe pagina via een javascript actie -> request

En elke keer begin je dus weer van voren af aan.

Wat dat boek 'hoofdgedeelte' noemt is denk ik de pagina die direct door de browser wordt aangeroepen. Vanuit die pagina kan je meerdere php bestanden (en andere bestanden) includen en binnen die bestanden kan je de constantes ook gebruiken (en andersom overigens, mits de include maar voor de define komt). Maar de hele omgeving, alle includes etc, blijven in het geheugen van de server tot de output naar de browser wordt gestuurd. Zodra de pagina is verstuurd en het script stopt..... is het geheugen weer leeg.
 



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.