Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

ASP's SUB in PHP?

Pagina: 1
Acties:
  • 913 views

Verwijderd

Topicstarter
Ben een beetje aan het experimenteren alleen loop tegen een probleem aan.
Als ik naar een pagina gaat opent die eerst bijvoorbeeld home.php.
Daarin staat het template geinclude template.php.
Voor de inhoud van deze template vraagt die weer een functie in home.php op die de inhoud vult.

Het probleem is dat wanneer ik een redirect in de functie wil doen is de header al verzonden in de template.
Kan dit oplossen door de output te cachen maar vindt dit niet zo'n mooie oplossing.

Vroeg me af of hier misschien iemand nog iets anders wist dan een functie, die wel gewoon alle variabelen meepakt die al gedefinieerd zijn zonder define te gebruiken.
Zodat ik het PHP en SQL buiten de ... kan uitvoeren en voor het verzenden van de header.
Of misschien een andere oplossing.

Volgens mij met ASP pakt SUB wel gewoon alle variabele op.

Alvast Bedankt.

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 04-11 05:12
hey martijn, kan je niet wat voorbeeldjes geven . Je verhaal is niet echt duidelijk namelijk (vind ik)

Volgens mij bedoel je dat te zeggen dat: Je niet kan redirecten vanuit een extern script, omdat je via een 'header' commando redirect, maar er al andere data in de header staat. Dit geeft dan een foutmelding in de trant van 'headers already sent'

Je zegt ook iets over variabelen. Bij PHP werkt dat iets anders. Ik verwacht niet dat je in classes programmeerd, maar zover ik weet moeten 'variabelen' beschikbaar zijn voor bestanden die worden geinclude. Tenzij die in classes e.d. staan.

ja, en ik ben je collega ;), en @ got, nee, de post is niet werkgerelateerd dus weet net zoveel als jullie :9

[ Voor 77% gewijzigd door mrFoce op 19-07-2008 16:46 ]


Verwijderd

Topicstarter
gideon82 schreef op zaterdag 19 juli 2008 @ 16:41:
hey martijn, kan je niet wat voorbeeldjes geven

ja, en ik ben je collega ;)
Jij bent er snel bij. :)

Eigenlijk gewoon het zelfde als bij ons.
Alleen inplaatst van een SUB gebruik ik een FUNCTION omdat ik geen PHP versie daarvan weet.

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 04-11 05:12
Verwijderd schreef op zaterdag 19 juli 2008 @ 16:46:
[...]

Jij bent er snel bij. :)

Eigenlijk gewoon het zelfde als bij ons.
Alleen inplaatst van een SUB gebruik ik een FUNCTION omdat ik geen PHP versie daarvan weet.
Ok, maar nu maak je het voor mij duidelijk, maar voor GoT niet. Blijft een publiek forum ;)

Zover ik weet heeft PHP geen subs, maar gebruikt enkel functions. Functies binnen PHP hoeven geen waarde te returnen, maar kunnen het wel. Je kan in PHP dus gewoon de functions gebruiken als ASP z'n Subs en Functions.


Bijv.
code:
1
2
3
4
5
6
7
8
9
function foo()
{
Echo "foo";
}

function bar()
{
return "bar";
}


ps , op GoT verwachten ze dat je in je topicstart verteld, wat je allemaal geprobeerd heb, waarop je heb gezocht e.d. ;)

[ Voor 16% gewijzigd door mrFoce op 19-07-2008 16:52 ]


Verwijderd

Topicstarter
gideon82 schreef op zaterdag 19 juli 2008 @ 16:49:
[...]

Ok, maar nu maak je het voor mij duidelijk, maar voor GoT niet. Blijft een publiek forum ;)

Zover ik weet heeft PHP geen subs, maar gebruikt enkel functions. Functies binnen PHP hoeven geen waarde te returnen, maar kunnen het wel. Je kan in PHP dus gewoon de functions gebruiken als ASP z'n Subs en Functions.


Bijv.
code:
1
2
3
4
5
6
7
8
9
function foo()
{
Echo "foo";
}

function bar()
{
return "bar";
}


ps , op GoT verwachten ze dat je in je topicstart verteld, wat je allemaal geprobeerd heb, waarop je heb gezocht e.d. ;)
Het probleem is dat wanneer ik mijn gegevens buiten de functie uit het database haal en een paar dingen controleer zodat ik eventueel een redirect kan doen.
Zou ik deze gegevens allemaal weer opnieuw in de functie moeten oproepen.
Omdat deze niet bekend zijn binnen de functie.
Is hier niet een oplossing voor?

Verwijderd

Verwijderd schreef op zaterdag 19 juli 2008 @ 17:01:
[...]
Omdat deze niet bekend zijn binnen de functie.
Is hier niet een oplossing voor?
Parameters?

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op zaterdag 19 juli 2008 @ 16:39:
Voor de inhoud van deze template vraagt die weer een functie in home.php op die de inhoud vult
De oplossing is om eerst alles af te handelen zoals form-input, dan de data te verzamelen die je in de templates nodig hebt, en pas op het laatste moment de template te vullen en te versturen. Je hebt dan een duidelijke logica in je scripts die het ook makkelijker maakt om fouten op te sporen.

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als je na output pas headers wil zetten zul je toch echt aan output buffering moeten doen. Verder denk ik dat je beter eerst wat tutorials kan doornemen want het komt erg basic op me over als je niet weet hoe je functies gebruikt...

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 04-11 05:12
Cartman! schreef op zaterdag 19 juli 2008 @ 17:07:
Als je na output pas headers wil zetten zul je toch echt aan output buffering moeten doen. Verder denk ik dat je beter eerst wat tutorials kan doornemen want het komt erg basic op me over als je niet weet hoe je functies gebruikt...
yup, zie bv http://www.phpwact.org/php/http_response_handling

Verwijderd

Topicstarter
Probleem is dat de functie in de template wordt uitgevoerd.
Kan hier natuurlijk een switch neerzetten en deze voor elke pagina een andere functie meegeven met 15 parameters maar vindt dit niet echt een mooie oplossing.
Vroeg me meer af of er in PHP niet net zoiets was als FUNCTION maar dan dat je dan ipv parameters gewoon alle variabelen oppakt.

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 04-11 05:12
Verwijderd schreef op zaterdag 19 juli 2008 @ 17:11:
[...]

Probleem is dat de functie in de template wordt uitgevoerd.
Kan hier natuurlijk een switch neerzetten en deze voor elke pagina een andere functie meegeven met 15 parameters maar vindt dit niet echt een mooie oplossing.
Vroeg me meer af of er in PHP niet net zoiets was als FUNCTION maar dan dat je dan ipv parameters gewoon alle variabelen oppakt.
heb je dit artikel gelezen over de scope van variabellen? http://nl.php.net/global

Je moet dus : global $a, $b; in de function zetten ($a is de naam van de variabele)

[ Voor 7% gewijzigd door mrFoce op 19-07-2008 17:14 ]


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op zaterdag 19 juli 2008 @ 17:11:
[...]
Probleem is dat de functie in de template wordt uitgevoerd.
Kan hier natuurlijk een switch neerzetten en deze voor elke pagina een andere functie meegeven met 15 parameters maar vindt dit niet echt een mooie oplossing.
Een functie met 15 parameters? Zeldzaam :P Ik denk dat je de hele applicatie beter kunt overdenken dan hiermee verdermodderen, want ik denk dat je een aantal dingen goed fout doet.

En output buffering is hier een slecht lapmiddel. Het kan soms handig zijn, maar dit is gewoon misbruik.

Verwijderd

Topicstarter
gideon82 schreef op zaterdag 19 juli 2008 @ 17:12:
[...]

heb je dit artikel gelezen over de scope van variabellen? http://nl.php.net/global

Je moet dus : global $a, $b; in de function zetten ($a is de naam van de variabele)
Inderdaad global was hem even vergeten.
Opzich is dat nog wel een aardig nette oplossing denk dat ik daar even mee aan de slag ga.
En anders moet ik het inderdaad maar even anders gaan aanpakken.

Thnx!

Verwijderd

Topicstarter
GlowMouse schreef op zaterdag 19 juli 2008 @ 17:13:
[...]

Een functie met 15 parameters? Zeldzaam :P Ik denk dat je de hele applicatie beter kunt overdenken dan hiermee verdermodderen, want ik denk dat je een aantal dingen goed fout doet.

En output buffering is hier een slecht lapmiddel. Het kan soms handig zijn, maar dit is gewoon misbruik.
Output buffering vindt ik inderdaad ook geen optie had ik al een tijd terug geprobeerd.
Houdt er rekening mee dat ik met deze functie de inhoud van me template wil vullen hier komen dus een aantal dingen uit het database te staan die ik aan de functie dan moet meegeven. :)
Kan natuurlijk ook alles in een variabel opslaan en daarna in de template zetten.
Maar vindt ik ook niet zo'n mooie oplossing.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je 15 variabelen global moet gaan maken voor één functie zit er denk ik toch iets niet goed. :)

offtopic:
ASP heeft helemaal geen sub, VBScript heeft dat. ASP is geen taal maar een omgeving.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Cartman!
  • Registratie: April 2000
  • Niet online
Volgens mij heb je gewoon totaal niet begrepen wat een goede structuur is, daarom raad ik het lezen van tutorials aan. Lees je eens in over template-engines (smarty bijv) en leer daar mee werken.

Ik weet niet wat ik trouwens netter vind in dit geval, output buffering of 15 globals :+

Verder eens met -NMe-: als je 15 params nodig hebt voor je functie of er 15 global moet maken dan klopt er iets niet. Een functie is bedoeld om 1 ding te doen, geen 2, geen 10, geen 15.

Verwijderd

Topicstarter
-NMe- schreef op zaterdag 19 juli 2008 @ 17:32:
Als je 15 variabelen global moet gaan maken voor één functie zit er denk ik toch iets niet goed. :)

offtopic:
ASP heeft helemaal geen sub, VBScript heeft dat. ASP is geen taal maar een omgeving.
Hoe zou jij de inhoud in template zetten dan?
PHP: home.php
1
2
3
4
5
6
7
8
9
<?php
//PHP SQL en checks en redirects

include_once( "template.php" );

function inhoud() {
 <div>Inhoud uit database</div>
}
?>

PHP: template.php
1
2
3
4
5
6
7
<html>
<head>
</head>
<body>
<?php inhoud(); ?>
</body>
</html>

Verwijderd

Topicstarter
Cartman! schreef op zaterdag 19 juli 2008 @ 17:47:
Volgens mij heb je gewoon totaal niet begrepen wat een goede structuur is, daarom raad ik het lezen van tutorials aan. Lees je eens in over template-engines (smarty bijv) en leer daar mee werken.

Ik weet niet wat ik trouwens netter vind in dit geval, output buffering of 15 globals :+

Verder eens met -NMe-: als je 15 params nodig hebt voor je functie of er 15 global moet maken dan klopt er iets niet. Een functie is bedoeld om 1 ding te doen, geen 2, geen 10, geen 15.
Heb even naar smarty gekeken maar die doet precies het zelfde alleen die gebruikt ipv een vast template bij iedere pagina een ander.
Dan zou ik inderdaad de functie weg kunnen laten maar dan heeft een template eigenlijk geen zin meer.

Verwijderd

Je kunt natuurlijk ook gewoon één argument meegeven aan een functie. Stop gewoon alle variabelen die je in de functie nodig hebt in een array.

Overigens is dit weer een typisch voorbeeld van iemand die meteen iets functioneels wil maken zonder de basis te beheersen. Kom op zeg, kijk gewoon even in de manual en ga daarmee hobby'en.

Tipje:
PHP:
1
2
3
4
5
6
function my_apply_template ( $filepath, $vars ) {
   extract ( $vars );
   ob_start ();
   include ( $filepath );
   return ob_get_clean ();
}

Dit is de basis zonder error-checking en andere ongein. Dat kun je vast zelf wel bedenken zodra je het nodig hebt.

Je kunt natuurlijk ook een template engine als Smarty te gaan gebruiken. Maar daar ben je echt nog niet klaar voor. Je komt gewoon een hoop basiskennis en ervaring tekort.

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op zaterdag 19 juli 2008 @ 18:04:
[...]

Heb even naar smarty gekeken maar die doet precies het zelfde alleen die gebruikt ipv een vast template bij iedere pagina een ander.
Dan zou ik inderdaad de functie weg kunnen laten maar dan heeft een template eigenlijk geen zin meer.
Niet goed gelezen dus, je kunt gewoon 1 main template gebruiken en dan per class custom eigen blocks gebruiken. Maar eerst de basis zien te beheersen is inderdaad een beter idee ;)

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 19 juli 2008 @ 18:07:
Je kunt natuurlijk ook gewoon één argument meegeven aan een functie. Stop gewoon alle variabelen die je in de functie nodig hebt in een array.

Overigens is dit weer een typisch voorbeeld van iemand die meteen iets functioneels wil maken zonder de basis te beheersen. Kom op zeg, kijk gewoon even in de manual en ga daarmee hobby'en.

Tipje:
PHP:
1
2
3
4
5
6
function my_apply_template ( $filepath, $vars ) {
   extract ( $vars );
   ob_start ();
   include ( $filepath );
   return ob_get_clean ();
}

Dit is de basis zonder error-checking en andere ongein. Dat kun je vast zelf wel bedenken zodra je het nodig hebt.

Je kunt natuurlijk ook een template engine als Smarty te gaan gebruiken. Maar daar ben je echt nog niet klaar voor. Je komt gewoon een hoop basiskennis en ervaring tekort.
15 parameters is uiteraard een overdreven voorbeeld zullen er niet meer dan 3 of 4 zijn.
Zo te zien ga je hier weer van output buffering uit.
Mijn vraag is eigenlijk gewoon of er een manier is om een stuk code te hergebruiken net zoals een functie alleen waarbij je niet de parameters hoeft mee te geven.
Blijkbaar is dit er niet.

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10 13:25
Verwijderd schreef op zaterdag 19 juli 2008 @ 19:36:
[...]
Mijn vraag is eigenlijk gewoon of er een manier is om een stuk code te hergebruiken net zoals een functie alleen waarbij je niet de parameters hoeft mee te geven.
Blijkbaar is dit er niet.
Natuurlijk kan het wel.
Je kunt in het voorbeeld bijvoorbeeld het pad hardcoden en de var-array uit de global-scope importeren.
Maar waarom zou je het willen?
Waarom wil je geen parameters gebruiken?

Verwijderd

Topicstarter
SH4D3H schreef op zaterdag 19 juli 2008 @ 19:41:
[...]

Natuurlijk kan het wel.
Je kunt in het voorbeeld bijvoorbeeld het pad hardcoden en de var-array uit de global-scope importeren.
Maar waarom zou je het willen?
Waarom wil je geen parameters gebruiken?
Vindt het niet erg om parameters te gebruiken vroeg alleen of het anders kon. :)
PHP:
1
2
3
4
5
6
7
$a = "test";

inhoud();

manier inhoud() {
    echo $a;
}

Resultaat:
test

  • Cartman!
  • Registratie: April 2000
  • Niet online
Sorry hoor maar ik snap er echt helemaal niks van wat je nu wilt. Kun je geen pseudo-code geven van je idee of hoe je het wil? Tuurlijk kun je namelijk meerdere keren een functie aanroepen, alleen zonder parameters ga je normaliter altijd hetzelfde resultaat terugkrijgen...

edit:
PHP:
1
2
3
4
5
6
7
8
$a = "test";

function inhoud() {
global $a;
echo $a;
}

inhoud();


tuurlijk kan dat, maar waarom zou je dat willen...

[ Voor 21% gewijzigd door Cartman! op 19-07-2008 20:57 ]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 17-11 12:53
Het is smerig, maar je kunt vanuit de functie bij de gehele globalscope komen via de superglobal $GLOBALS

PHP:
1
2
3
4
$foo = 'bar';
function foorbar() {
   echo $GLOBALS['foo'];
}

Verwijderd

Topicstarter
Cartman! schreef op zaterdag 19 juli 2008 @ 20:55:
Sorry hoor maar ik snap er echt helemaal niks van wat je nu wilt. Kun je geen pseudo-code geven van je idee of hoe je het wil? Tuurlijk kun je namelijk meerdere keren een functie aanroepen, alleen zonder parameters ga je normaliter altijd hetzelfde resultaat terugkrijgen...

edit:
PHP:
1
2
3
4
5
6
7
8
$a = "test";

function inhoud() {
global $a;
echo $a;
}

inhoud();


tuurlijk kan dat, maar waarom zou je dat willen...
Dit is misschien iets duidelijker
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
$a = "test"; 

inhoud(); 

$a = "tset";

inhoud();

manier inhoud() { 
    echo $a; 
}
?>

Resultaat:
testtset

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-11 16:51

Patriot

Fulltime #whatpulsert

Dat kan toch ook gewoon met de functie die Cartman! je geeft? Dit kan gewoon hoor:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

function inhoud()
{
  global $a;
  echo $a;
}

$a = "test";

inhoud();

$a = "tset";

inhoud();

?>


Maargoed, het blijft een slechte manier om dit te doen. Het is gewoon erg jammer dat je totaal niet bereid bent om wat onderzoek te doen naar de goede manier om dit te doen. Je code word zo vreselijk lastig te onderhouden, en dat resulteert op den duur weer in topics op GoT waarin de meest vreemd in elkaar gezette code langskomt. Dat hoeft dan in jouw geval niet per sé zo te zijn, maar in de praktijk gebeurt het veel. En dat kan erg vervelend zijn, omdat het niet leuk is om veel moeite te steken in het oplossen van problemen met dergelijke scripts.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op zaterdag 19 juli 2008 @ 19:36:
15 parameters is uiteraard een overdreven voorbeeld zullen er niet meer dan 3 of 4 zijn.
Niks mis met een paar parameters, of gewoon zoals Cheatah hierboven doet met een array en een path als parameters.
Zo te zien ga je hier weer van output buffering uit.
En zo te zien blijf jij er maar vanuit gaan dat dat slecht is. ;)
Mijn vraag is eigenlijk gewoon of er een manier is om een stuk code te hergebruiken net zoals een functie alleen waarbij je niet de parameters hoeft mee te geven.
Blijkbaar is dit er niet.
Dat moet je niet eens willen. Het wordt er niet duidelijker op als je "ineens" overal in je code variabelen terug ziet komen waarvan je zo op het eerste gezicht geen idee hebt waar ze vanaf komen. Wanneer je gewoon met lokale variabelen werkte heb je daar tenminste geen last van en is debuggen 100x makkelijker.

Verder is hier eigenlijk alles wel gezegd wat erover te zeggen valt. Verdere informatie vind je terug in de manual of een basishandleiding over PHP en templates of PHP en functies/scopes in het algemeen. Ik stel voor dat je je daar even in gaat verdiepen, want dan kom je hier best wel uit. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.