Hoe moet ik weten dat jij B bedoelt als je A zegt?
Als je de link opent naar de betreffende pagina op de PHP website, dan weet je dat.

En waar denk je dat ik überhaupt vandaan heb gehaald dat call-time pass-by-reference (PBR) deprecated is? Dat wist ik namelijk niet voor ik op de link had geklikt.
edit: PHP.net noemt het zelf anders ook gewoon pass by reference in eerste instantie. En een paar regels lager staat dat het deprecated is en daar noemen ze het idd call-time pass by reference:
Dan snap je gewoon niet wat er staat. Wat ook blijkt uit je volgende post:
edit: ik heb volgens mij wel gewoon gelijk. Als je de variabele als volgt doorgeeft: &$var (dus met ampersand), dan is dat per definitie pass-by-reference. Alle andere vormen - dus gewoon $var - is pass by value, ook als het object referenties betreft. Ditzelfde misverstand bestaat ook bij Java, waar er uberhaupt geen pass by reference bestaat, enkel pass by value.
Zie ook
hier
Met ampersand wordt het pass by ref genoemd en anders gewoon pass by value. En die hele variable passing met een ampserand is deprecated.
Dus als ik even de pedante onderwijzer uit mag uithangen:
Pass by reference is het concept waarbij een referentie naar een variabele wordt meegegeven aan een functie. Een aanpassing die de functie maakt is dan zichtbaar buiten de functie. Dit staat nog even geheel los van hoe je dat specifiek bewerkstelligt in PHP.
In PHP zijn (waren) er 2 manieren waarop je duidelijk kon maken dat je PBR wilde toepassen.
• Door een & te plaatsen voor de parameter bij de functiedefinitie. Laten we dat voor het gemak maar even definition-time PBR noemen.
PHP:
1
2
3
4
5
6
7
8
| function foo(&$a) // & staat dus bij de functie-definitie
{
$a = 42;
}
$b = 1;
foo($b);
echo $b; // "42" |
• Door een & te plaatsen voor het argument bij de aanroep van de functie, wat PHP call-time PBR noemt.
PHP:
1
2
3
4
5
6
7
8
| function foo($a) // geen & hier, lijkt gewoon een pass-by-value functie
{
$a = 42;
}
$b = 1;
foo(&$b); // hier nu wel een &, dus stiekem toch pass-by-reference, ookal weet 'foo' daar eigenlijk niets van.
echo $b; // "42" |
In de PHP docs staat:
You can pass a variable by reference to a function so the function can modify the variable. The syntax is as follows:
En vervolgens volgt er een voorbeeld met louter
definition-time PBR. Dat voorbeeld is dus prima en kun je gewoon blijven gebruiken.
Daarna volgt er een note:
There is no reference sign on a function call - only on function definitions
Oftewel, de & moet je alleen gebruiken bij function
definitions, en niet bij function
calls. Waarom? Nou:
As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.
Ze hebben het daar over de aanroep, niet over de definitie van foo. Ik ben het met je eens dat het duidelijker gespecificeerd kon worden, maar strict gezien klopt de documentatie wel en jouw opmerking duidelijk niet. Wat op zich niet erg is, iedereen maakt weleens fouten of interpreteert iets verkeerd. Dat doe ik ook weleens, en daar mag men mij gewoon op wijzen. Echter:
Ik vind het gewoon vervelend dat ik op een soort pedante onderwijzer manier tot de orde geroepen wordt, terwijl ik iets zeg wat volkomen valide is.
Sorry, maar hoe je het ook went of keert, je raadt gewoon af om PBR te gebruiken, en dat is, zoals ik al zei, onzin. Misschien is dat niet wat je bedoelde, maar je kan van mij niet verwachten dat ik over het telepatische vermogen beschik om jouw achterliggende gedachtengang op te vangen.
En als ik eerlijk ben, lees ik vaker dat soort posts van je .oisyn.
Klopt. Als ik zie dat iemand onzin verkondigt dan verbeter ik dat (en ik verwacht dat anderen dat ook bij mij doen). Als iemand die niet bekend is met PHP jouw post leest kan hij, geheel ten onrechte, gaan denken dat hij helemaal nooit PBR moet gebruiken. Ik wil de lezer daarvoor behoeden en dus verbeter ik je. Het zal me echt aan mijn kont roesten wat jij daarvan denkt, want waar het mij primair om gaat is dat anderen correcte informatie meekrijgen. Als je je daarbij op je tere zieltje getrapt voelt (zonder dat ik ook maar enigszins een persoonlijke aanval in mijn post verwerk) dan ligt dat gewoon aan jezelf. Want mag ik je er ondertussen even op wijzen dat het vooral jijzelf is die hier nogal onbeschoft op de man aan het spelen is? Want wat was er nou werkelijk zo vervelend aan mijn oorspronkelijke reactie? Dat ik het woord "onzin" gebruikte voor iets dat feitelijk gewoon onzin ís?
C kan prima zonder classes - onnodige taalconstructie!
Dat een taal zonder kán wil nog niet zeggen dat het geen verdomd handige feature is

. Voorheen (voor versie 7) waren er ook geen closures in Java (of LINQ in .Net, of variadic templates in C++, of...). Als je jouw redenatie volgt was er ook geen enkele reden om die toe te voegen voor versie 7. Java kon zonder dus het is immers een onnodige taalconstructie. Het feit dat vrijwel elke volwassen taal ze inmiddels wel heeft spreekt overigens boekdelen. Het feit dat vrijwel elke andere taal pass-by-reference ondersteunt overigens ook, blijkbaar is het toch wel een handige feature.
[
Voor 33% gewijzigd door
.oisyn op 14-01-2013 01:45
]