[PHP] allow_call_time_pass_reference

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 19:01

me1299

$ondertitel

Topicstarter
Ik heb een handige class gevonden die het maken van formulieren wat makkelijker zou moeten maken.

Nu werkt deze class niet en krijg ik superveel errors in de trand van:
Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer.
De methode van & snap ik niet helemaal. Maar ik dacht dat het misschien handig was om de allow_call_time_pass_reference die in de php ini opgegeven staat te wijzigen.

Nu heb ik geen toegang tot de php.ini file.

Mijn vraag is: Is het mogelijk deze waarde te wijzigen in het script of via htaccess?

In mijn .htaccess file heb ik deze regel staan:

code:
1
php_value allow_call_time_pass_reference 1


Dat werkt dus niet, ik merk iig geen verschil bij het draaien van het script. Ook heb ik in het php bestandje de volgende regel te zetten:

PHP:
1
2
3
<?php
ini_set("allow_call_time_pass_reference", 1);
?>


Maar dat werkt ook niet :?

Iemand een idee wat ik fout doe? Of is het niet mogelijk deze instelling te wijzigen (hehalve in de ini file dan)

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

DeathKnight schreef op 24 January 2003 @ 11:03:
De methode van & snap ik niet helemaal. Maar ik dacht dat het misschien handig was om de allow_call_time_pass_reference die in de php ini opgegeven staat te wijzigen.

Euh...
Omdat je niet snapt hoe je met die & om moet gaan ga je maar aan de config opties van php rommelen?

Neem dan van mij aan dat je die parameter nergens voor nodig hebt...

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
check de reply van DiEana in dit topic. wilde gok, maar lijkt erop dat het hier mee te maken heeft...

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 19:01

me1299

$ondertitel

Topicstarter
ACM schreef op 24 januari 2003 @ 11:34:

[...]

Euh...
Omdat je niet snapt hoe je met die & om moet gaan ga je maar aan de config opties van php rommelen?

Neem dan van mij aan dat je die parameter nergens voor nodig hebt...
Naja die methode wordt zo'n paar honderd keer gebruikt in classes, dus het lijkt me daarom handiger om in éen keer het te laten werken dan dat ik al die files moet gaan wijzigen.

Verder was de reply in dat topic niet iets waar ik mee verder kan. Ik heb namelijk al geprobeerd die & weg te halen e.d. maar toen werkte dat script helemaal niet meer.

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als je nou zegt wat er fout gaat :?

Want je wilt vast dit doen:
PHP:
1
2
3
4
5
6
function x($var)
{
}

$y = 1;
x(&$y);


dat mag tegenwoordig niet meer, doe het eens zo:
PHP:
1
2
3
4
5
6
function x(&$var)
{
}

$y = 1;
x($y);


Dat laatste is dus wel geldig en daarvan weet je zeker(der) dat het in volgende php-versies nog steeds beschikbaar is...

(of was het nou andersom? :P )

[ Voor 5% gewijzigd door ACM op 24-01-2003 12:00 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ACM schreef op 24 januari 2003 @ 11:56:

(of was het nou andersom? :P )
ja volgens dat topic waar ik naar linkte wel :P

tsja en het verwondert me niet echt dat het niet meer werkt als je met de botte bijl alle &'s weghaalt. je zult ze toch moet verplaatsen :)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Genoil schreef op 24 January 2003 @ 12:07:
ja volgens dat topic waar ik naar linkte wel :P

Nee, zijn reactie is wat onduidelijk :P

Mijn eerste voorbeeld mag dus niet meer en dat tweede wel.

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 19:01

me1299

$ondertitel

Topicstarter
Het klinkt misschien lui maar zou iemand globaal kunnen toelichten waar die & nu precies voor wordt gebruikt?

Ik heb iig het idee dat je het alleen kan gebruiken als je allow_call_time_pass_reference aan hebt staan in je php.ini dus mijn primaire vraag of dat via een script te wijzigen is staat nog B)

[ Voor 49% gewijzigd door me1299 op 24-01-2003 13:25 ]

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
DeathKnight schreef op 24 January 2003 @ 13:24:
Het klinkt misschien lui maar zou iemand globaal kunnen toelichten waar die & nu precies voor wordt gebruikt?

Ik heb iig het idee dat je het alleen kan gebruiken als je allow_call_time_pass_reference aan hebt staan in je php.ini dus mijn primaire vraag of dat via een script te wijzigen is staat nog B)
het is ook lui :P
over de & (ofwel references) zijn de afgelopen maanden al zoveel topics langsgekomen, zoek maar eens op "reference". en anders is er altijd nog PHP.net

"calltime" passing by reference betekent dat je een variabele in de aanroep (call)van een functie "omzet" in een reference, hetgeen vanaf PHP4.3 niet standaard meer kan/mag. misschien dat je het via een ini setting kunt overriden, maar dat zou ik sowieso niet doen, omdat je dan op een server waar die override niet gedaan is weer met precies hetzelfde probleem zit. beetje hetzelfde als het register_globals verhaal...

[ Voor 8% gewijzigd door Genoil op 24-01-2003 13:37 ]


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
ACM schreef op 24 January 2003 @ 11:56:
Dat laatste is dus wel geldig en daarvan weet je zeker(der) dat het in volgende php-versies nog steeds beschikbaar is...

(of was het nou andersom? :P )

Foei! ACM, daar ga je weer van je voetstuk :P

Natuurlijk is je tweede voorbeeld veel cleaner. Immers je geeft nu expliciet in de functie declaratie aan dat het te passen argument een reference argument is. Hier houd de programmeur van de functie dus rekening mee en doet bewerkingen erop, waardoor de waarde van de parameter veranderd of zelfs de parameter word vervangen( eigenlijk is dat al niet de bedoeling van een 'parameter' maarja ;) )

Bij het eerste voorbeeld
PHP:
1
2
function doIets( $bla ) { }
doIets( &$bla );

Gebruik je in doIets() $bla impliciet als reference. De programmeur van die functie weet dat dus niet en daar houd die functie dus ook geen rekening mee. Hell, hij kan die variabele wel ondertussen tijdelijk veranderen voor een teller oid wat dus een onbedoeld effect heeft op de parameter. Het is dus alleen te gebruiken op functies die je zelf gecoded hebt, omdat je daar de precieze werking van weet.
Ranzig dus :P

Voor de topicstarter:
De & staat voor reference. Normaal geeft PHP variabeles door als values (dus kopien van de variabeles) en kan er alles vrijlijk in veranderd worden zonder dat het op iets buiten de scope effect heeft. Voorbeeld.

PHP:
1
2
3
4
5
6
7
8
function telEenOp( &$getal ) { $getal++; }

function trekEenAf( $getal ) { $getal--; }

$getal = 10;
telEenOp( $getal );
trekEenAf( $getal );
echo $getal;

Dit zal 11 opleveren. Immers 10 werd als 'verwijzing' doorgegeven naar telEenOp() en als kopie naar trekEenAf()

Die allow_call_time_pass_reference heeft hier niets mee te maken, maar stelt je in staat het volgende te doen
PHP:
1
2
3
4
5
6
7
8
9
10
11
function telEenOp( &$getal ) { $getal++; }

function trekEenAf( $getal ) { $getal--; }

$getal = 10;
telEenOp( $getal );
// Nu toch stiekem een verwijzing passen naar
// trekEenAf
//
trekEenAf( &$getal );
echo $getal;

Zie je die & voor de parameter $getal? Dan ga je dus toch stiekem die variabele als 'reference/verwijzing' doorgeven, waardoor een wijziging op die variabele in de functie TOCH een effect heeft op je variabele buiten de functie. Terwijl trekEenAf() daar niet voor gemaakt was.
Waarom je dat NIET moet gebruiken heb ik hierboven beschreven.

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 19:01

me1299

$ondertitel

Topicstarter
Glimi schreef op 24 January 2003 @ 13:43:

[...]

Foei! ACM, daar ga je weer van je voetstuk :P

Natuurlijk is je tweede voorbeeld veel cleaner. Immers je geeft nu expliciet in de functie declaratie aan dat het te passen argument een reference argument is. Hier houd de programmeur van de functie dus rekening mee en doet bewerkingen erop, waardoor de waarde van de parameter veranderd of zelfs de parameter word vervangen( eigenlijk is dat al niet de bedoeling van een 'parameter' maarja ;) )

Bij het eerste voorbeeld
PHP:
1
2
function doIets( $bla ) { }
doIets( &$bla );

Gebruik je in doIets() $bla impliciet als reference. De programmeur van die functie weet dat dus niet en daar houd die functie dus ook geen rekening mee. Hell, hij kan die variabele wel ondertussen tijdelijk veranderen voor een teller oid wat dus een onbedoeld effect heeft op de parameter. Het is dus alleen te gebruiken op functies die je zelf gecoded hebt, omdat je daar de precieze werking van weet.
Ranzig dus :P

Voor de topicstarter:
De & staat voor reference. Normaal geeft PHP variabeles door als values (dus kopien van de variabeles) en kan er alles vrijlijk in veranderd worden zonder dat het op iets buiten de scope effect heeft. Voorbeeld.

PHP:
1
2
3
4
5
6
7
8
function telEenOp( &$getal ) { $getal++; }

function trekEenAf( $getal ) { $getal--; }

$getal = 10;
telEenOp( $getal );
trekEenAf( $getal );
echo $getal;

Dit zal 11 opleveren. Immers 10 werd als 'verwijzing' doorgegeven naar <code>telEenOp()</code> en als kopie naar <code>trekEenAf()</code>

Die <code>allow_call_time_pass_reference</code> heeft hier niets mee te maken, maar stelt je in staat het volgende te doen
PHP:
1
2
3
4
5
6
7
8
9
10
11
function telEenOp( &$getal ) { $getal++; }

function trekEenAf( $getal ) { $getal--; }

$getal = 10;
telEenOp( $getal );
// Nu toch stiekem een verwijzing passen naar
// trekEenAf
//
trekEenAf( &$getal );
echo $getal;

Zie je die & voor de parameter $getal? Dan ga je dus toch stiekem die variabele als 'reference/verwijzing' doorgeven, waardoor een wijziging op die variabele in de functie TOCH een effect heeft op je variabele buiten de functie. Terwijl <code>trekEenAf()</code> daar niet voor gemaakt was.
Waarom je dat NIET moet gebruiken heb ik hierboven beschreven.
_/-\o_ Bedankt voor je meer dan heldere uitleg, je verdiend een tegoed bon voor een gratis biertje mocht je je ooit in een gat bevinden wat Dirksland heet ;)

Opzich is het wel een handige functie maar ik zal hem nu iig niet gebruiken ;)

Voor mijn blijft nu de optie om die classes te gaan editten of het lekker te laten voor wat het is en handmatig formpjes blijven coden.

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Glimi schreef op 24 januari 2003 @ 13:43:
Foei! ACM, daar ga je weer van je voetstuk :P

Lieverd:
ACM schreef op 24 januari 2003 @ 11:56:
Als je nou zegt wat er fout gaat :?

Want je wilt vast dit doen:
[php code]
dat mag tegenwoordig niet meer, doe het eens zo:
Lezen :P
Pagina: 1