Functie variable gebruiken buiten functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jony V

Jony V

15/02/2014 09:39:16
Quote Anchor link
Hallo

Ik heb een vraag over functies en variables in php.
Ik zou graag een variable die in een functie gebruikt worden, gebruiken buiten een functie. (dus niet omgekeerd, een variabele buiten functie gebruiken binnen functie, dat doe je met global).

Stel je hebt bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
function foo() {
    $data = 'value';
}

en je wilt $data gebruiken buiten de functie
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo $data;
 
PHP hulp

PHP hulp

22/12/2024 10:14:40
 
Ivo P

Ivo P

15/02/2014 11:05:17
Quote Anchor link
dat gaat nu net tegen het algemene nut van functies in.

Maar goed: dat werkt natuurlijk ook omgekeerd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

function foo() {
   global $data;
   $data = 'value';
}


foo();

echo $data;
?>


Of een alternatief: by reference:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

function bar(&$gegeven)
{

   $gegeven = 'value';
}


$data = null;
bar($data);

echo $data;

?>
 
Kevin Zegikniet

Kevin Zegikniet

15/02/2014 11:16:42
Quote Anchor link
Kun je niet gewoon returnen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
function foo() {
    $data = 'value';
return $data;
}


en dan waar je de functie aanroept:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$somevar = foo();
echo $somevar;


Tenminste, dat is hoe ik het zou proberen.
Gewijzigd op 15/02/2014 11:17:18 door Kevin Zegikniet
 
Ivo P

Ivo P

15/02/2014 11:17:56
Quote Anchor link
Dat ligt inderdaad het meest voor de hand. alleen kan een functie maar 1 var returnen. Meestal komt zo'n vraag voort uit "ik moet meer waarden aanpassen met een functie"
 
Jony V

Jony V

15/02/2014 11:22:57
Quote Anchor link
Ik wil het op deze manier gebruiken:
index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
function foo(){
    $data = 'value';
    require_once 'file.php';
}

en daarna $data in file.php gebruiken:
file.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<h1>File</h1>
<ul>
    <li><?php echo $data; ?></li>
</ul>
Gewijzigd op 15/02/2014 11:28:17 door Jony V
 
Ivo P

Ivo P

15/02/2014 11:37:44
Quote Anchor link
Dat zou sowieso al moeten werken.

Het blijft wat raar in mijn beleving om in een functie een include te gebruiken, maar het kan wel.

Let wel op, wat er precies gebeurt als er in file.php ook weer functie-definities of classes etc voorkomen.
Dan staat er een functie in een functie. Wat is daar dan precies de scope van?

Maar $data zou moeten werken, zoals je het hier toont
 
Jony V

Jony V

15/02/2014 12:02:30
Quote Anchor link
Mmm, dan lijkt het niet te werken doordat ik i.p.v. een require gebruik maak van een custom functie, die eerst bekijkt of het bestand bestaat. Deze functie staat in de root class (index.php bevat geen classes, enkel functies, file.php bevat geen functies of classes)

index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
function foo() {
    $data = 'value';
    root::load_file('file.php');
}


Op deze manier werkt het niet, enig idee waarom? Wanneer ik get_included_files() gebruik, staat file.php er nochtans tussen. De class root ziet er als volgt uit:
root.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
class root {
    function load_file($filename) {
        if (file_exists($filename)) {
            require_once $filename;
        }
    }
}
Gewijzigd op 15/02/2014 12:05:01 door Jony V
 
Ivo P

Ivo P

15/02/2014 12:09:21
Quote Anchor link
je hebt daarmee de file geinclude binnen in de custom functie in de root-class.

Dus hij staat helemaal niet op de plek waar je hem nodig had.

Ik stel altijd, dat een te includen file aanwezig is. Dat is namelijk bij het uploaden van de site zo geregeld.
Er kunnen bij mij geen files toegevoegd worden, of verwijderd worden door het systeem of door gebruikers.

Dus net zo goed als dat index.php als config.php aanwezig zijn, zal ook file.php aanwezig moeten zijn.
Zo niet, dan is dat een harde error waardig.

Ik vind daarmee je omweg met de controle nogal een overkill.

Anders is het als het uit gemakzucht niet 100% zeker is of een bepaalde view file in de map "huidige actie" zit of in "algemene files als footer.php, header.php" te vinden is.
Daar heb ik wel een soort van "zoek de view-file" voor, maar ik weet dan eigenlijk wel zeker dat de file ergens aanwezig is in 1 van de 3 of 4 mogelijke locaties.
 
Jony V

Jony V

15/02/2014 17:02:47
Quote Anchor link
Het zou inderdaad een beetje overkill zijn zo, maar ik doe enkel niet alleen een check, maar bij de werkelijke functie zijn er nog dingen aan toegevoegd, dat ik bv niet heel het path moet typen, maar enkel de filename.
Kan ik het op één of andere manier toch op de juiste plaats includen, gebruik makend van de functie in de root-class?
 
Ivo P

Ivo P

15/02/2014 19:17:07
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
function foo() {
    $data = 'value';
    include root::get_path_for_file('file.php');
}

?>


en in root staat dan een static method die inderdaad net als je get_file() method dat path opzoekt, maar ipv include, geeft die functie alleen het complete path retour.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
class root
{
   public static function get_path_for_file($filename)
   {

      // zoek uit waar hij staat
      return $path . $filename;

   }

?>

}
 
Jony V

Jony V

16/02/2014 19:24:24
Quote Anchor link
Bedankt!
 
Ivo P

Ivo P

16/02/2014 20:02:11
Quote Anchor link
en om vrijwel dubbele code te voorkomen, laat je voortaan ook get_file() in root die functie get_path_for_file() aanroepen om de file te vinden.

Mits je die get_file() nog wilt blijven gebruiken natuurlijk.
 
Dh boor

dh boor

21/04/2014 22:43:02
Quote Anchor link
Ivo P op 15/02/2014 11:05:17:
dat gaat nu net tegen het algemene nut van functies in.


Misschien een onnozele of rare vraag - ik ben een soort herintredende beginneling na 10 jaar geen php - maar waarom is dat tegen het nut van functies?
Ik gebruik functies vaak om code steeds opnieuw te kunnen gebruiken. Dan is het juist handig om variabelen er uit te kunnen gebruiken. Maar zo 'hoort het niet'?
Kun je me uitleggen waarom niet? Of hoe dan wel? Of een leuk artikel/link?
Alvast erg bedankt.
 
Ivo P

Ivo P

22/04/2014 09:21:07
Quote Anchor link
Een functie zou een afgesloten doos moeten zijn: je stop er een paar dingen in, en er gebeurt iets, of er komt iets uit terug.

Hoe dat opgelost wordt intern, moet geen invloed hebben op jouw script.

Voorbeeld: laten we de functie faculteit nemen.

5! = 1 * 2 * 3 * 4 * 5 = 120

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

$i
= 5;

$f = faculteit($i);
echo $i .'! = '. $f;
?>


het is dat handig dat $i gewoon 5 blijft.

Stel dat er in deze functie nu staat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
function faculteit($n)
{

 $f = 1;
 for($i=$n;$i>0;$i--) {
     $f = $f * $i;
 }

 return $f;
}

?>


$i hoort hier intern in de functie te blijven en niet invloed moeten hebben op de $i in je hoofdscript.

Want anders zou $i ineens 1 zijn en krijg je " 1! = 120" op je scherm...

Andere reden: een functie zou universeel bruikbaar moeten zijn.

er gaan 0, 1 of meer parameters (waarden) in, en er komt iets terug.
Het moet niet zo zijn, dat de functie uit de globale namespace een waarde oppikt om iets mee te doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
functie faculteit()
{

   global $n;
   $f = 1;
   for($i=$n;$i>0;$i--) {
     $f = $f * $i;
   }

   return $f;
}


$n = 5;
echo factulteit();
?>


Dit zou dus werken, maar beperkt je functie: je MOET dan $n gebruiken als invoer, en als je $x =10 hebt, dan werkt je functie niet meer.
 
Dh boor

dh boor

22/04/2014 15:31:08
Quote Anchor link
Dankjewel voor je uitgebreide antwoord!
Je schrijft 'of er komt iets uit terug'. Dat mogen eigenlijk geen variabelen zijn, dus?

Dan even andersom:
ik wil dit graag doen: in een script moet een stukje code een x aantal keer random twee getallen kiezen uit een aangegeven range.
Die random-getallengenerator wil ik in verschillende scripts gebruiken, maar dan steeds voor net iets andere doeleinden. Dan ligt het toch voor de hand om er een functie van te maken, die in een file te zetten en steeds die file te includen? Of zou het theoretisch anders moeten?
Het werkt namelijk op zich prima.
 
Ivo P

Ivo P

22/04/2014 15:42:19
Quote Anchor link
Dat is een goed voorbeeld:

een functie die 2 getallen kiest uit een range

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

function random_it($min, $max)
{

   $aRange = range($min, $max);
   shuffle($aRange);

   return array_slice($aRange,0,2);

}

?>


Er gaat iets in (min en max van de keuze lijst).
Er komt iets terug (een array met 2 waarden).

Zou je met global vars werken, dan moet je overal in je scripts zorgen dat er steeds dezelfde namen voor vars gebruikt worden.

(functie is trouwens uitbreidbaar met een derde parameter die van 2 ook 3, 4 of 10 waarden zou kunnen laten teruggeven.)
 
Dh boor

dh boor

22/04/2014 15:49:58
Quote Anchor link
Ok, bedankt.
Wat is dan het werkelijke verschil tussen een var via global buiten de functie beschikbaar maken en wat jij doet via return?
 
Ivo P

Ivo P

22/04/2014 15:58:53
Quote Anchor link
ok
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function random_it($min, $max)
{

   global $a;
   global $b;
   $aRange = range($min, $max);
   shuffle($aRange);

   $a = $aRange[0];
   $b = $aRange[1];
}



random_it(200, 400);

?>

$a en $b krijgen nu een waarde die veroorzaakt wordt door de aanroep van de functie.
Je geeft nu aan dat je op meerdere pagina's die functie wilt gebruiken.

Op elke pagina heb je dan verplicht een $a en $b nodig.

Dus als je daar met $x en $y wilt werken, dan moet je eerst kijken in de functie "oh ja die gebruikte $a en $b", en dan de waarde van $a maar naar $x en $b naar $y kopieren?

Om nog maar te zwijgen van de mogelijkheid dat je die 2 waarden binnen een andere functie wilt gebruiken.

Het mooie van een functie is nu net dat het een zwarte doos is: je stopt er iets in en je krijgt iets terug. Hoe dat intern gaat, doet er niet toe.

oh:
en je collega heeft een andere functie geschreven: hij bepaalt van een getal het kwadraat:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

functie kwadraat($i)
{

  global $a;
  $a = $i * $i;
}


?>


en nu heeft jouw script zowel jouw functie als die van je collega nodig.
Beide rommelen met $a uit de globale namespace.
Gewijzigd op 22/04/2014 16:10:01 door Ivo P
 
Dh boor

dh boor

22/04/2014 16:09:03
Quote Anchor link
Hartstikke duidelijk, thanks!!
 



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.