De 'scope' van een constante.
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:
Waarom is de constante in mijn aanmelden.php niet bekend? Heeft dat met de sessie te maken? Wat doe ik fout?
Nico
Als dat niet via index.php gaat zal je defines.php moeten includen in aanmelden.php.
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
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.
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:
Dit is misschien een nieuwe request. Maar als ik in index.php de regel:
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
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
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.
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...
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.