Het is voornamelijk een kwestie van stijl, maar ik ben toch wel benieuwd wat jullie doen als een parameter een lange waarde heeft. Stop je die waarde eerst in een variabele en geef je die variabele dan door aan de functie? Of stop je de lange parameter rechtstreeks in de functie?
Voorbeeld:
Stel een of andere functie (bijv. processMessage) vraagt om 3 parameters, $message (string), $show (boolean) en $code (int).
Stel nu dat de waarde van $message een vrij lange zin is, maak je hier dan een aparte variabele voor aan, of stop je de message rechtstreeks in de functie, maar laat je de parameters op de volgende regel doorlopen.
Voorbeeldje:
Doe jij dit (situatie A, je maakt een variabele $message aan en die stop je in de functie):
<?php
$who = 'jullie allemaal';
if ($status === true) {
$message = 'Dit is best een vrij lange voorbeeldzin zoals ' . $who . ' denk ik wel kunnen zien.';
$this->processMessage($message, true, 1);
}
?>
Of doe jij dit (situatie B, je stopt de lange waarde meteen in de functie)?
<?php
$who = 'jullie allemaal';
if ($status === true) {
$this->processMessage('Dit is best een vrij lange voorbeeldzin zoals ' . $who . ' denk ik wel
kunnen zien.', true, 1);
}
?>
Dan zou ik hier toch de versie met drie aparte regels voor drie argumenten gebruiken.
Maar ik begrijp wat je bedoelt: waar ligt de grens dan? Als het dramatisch wordt, zou ik de aanbevolen limiet van 80 karakters aanhouden. Alleen zó blijft de tekst makkelijk te lezen, bewerken, vertalen, printen...
<?php
/* 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0
---------+---------+---------+---------+---------+---------+---------+---------+ */
$bar->setFoo(
'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
philosophi Graeco sermone tractavissent, ea Latinis litteris
mandaremus, fore ut hic noster labor in varias reprehensiones
incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
remissius agatur, sed tantum studium tamque multam operam ponendam in
eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
contemnentes Latinas, qui se dicant in Graecis legendis operam malle
consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
dignitatis esse negent.',
true,
false
);
?>
Ah oke... maar je springt de string (zeg dat eens 10x achter elkaar) dus wel in zie ik. Je doet dus niet dit?
<?php
$bar->setFoo(
'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
philosophi Graeco sermone tractavissent, ea Latinis litteris
mandaremus, fore ut hic noster labor in varias reprehensiones
incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
remissius agatur, sed tantum studium tamque multam operam ponendam in
eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
contemnentes Latinas, qui se dicant in Graecis legendis operam malle
consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
dignitatis esse negent.',
true,
false
);
?>
Of laten we eens heel gek doen... dit:
<?php
$bar->setFoo(
'
Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
philosophi Graeco sermone tractavissent, ea Latinis litteris
mandaremus, fore ut hic noster labor in varias reprehensiones
incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
remissius agatur, sed tantum studium tamque multam operam ponendam in
eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
contemnentes Latinas, qui se dicant in Graecis legendis operam malle
consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
dignitatis esse negent.
',
true,
false
);
?>
Ah oke... maar je springt de string (zeg dat eens 10x achter elkaar) dus wel in zie ik.
Ja, want met die inspringingen zie je nog steeds dat het drie argumenten zijn. Stel je maar eens hetzelfde voor met drie van die argumenten (waar in het voorbeeld nu slechts booleans staan).
Een lastiger voorbeeld is deze autoloader met een anonieme functie. Toch blijft duidelijk wat de drie argumenten van spl_autoload_register() zijn en waar de anonieme functie begint en eindigt:
Eén regel is hier langer dan 80 karakters, maar zit nog binnen de 120 karakters. Dat vind ik een duidelijkere oplossing dan $namespace afkorten tot $ns: afkortingen doen soms meer afbreuk aan de leesbaarheid dan lange regels code. De interne PHP-constante heet immers ook DIRECTORY_SEPARATOR en niet DIR_SEP.
Kan ook, over de K&R-stijl versus de Allman-stijl heb ik al eens wat geschreven in een boek...
Belangrijk is vooral overzicht op een relatief klein schermoppervlak. Stel dat je snel wat moet fixen op een notebook omdat een site er ergens uit ligt. Dan wil je vooral niet per ongeluk op een verkeerde plaats iets toevoegen of verwijderen.
Geen van de laatste voorbeelden vind ik in dat opzicht wezenlijk beter of slechter dan de andere.
Het is kwestie van persoonlijke voorkeur en voorkeur van de context. Als ik bijv. iets maak voor symony moet ik me houden aan hun code standards, als ik iets schrijf voor doctrine moet ik me houden aan de doctrine code standards.
Binnen een bedrijf heb je als het goed is ook code standards. En als het helemaal goed is zorgen al deze standards dat ze compatible zijn met de psr standards, aangezien dat ervoor zorgt dat alle php mensen over de wereld jou code begrijpen en kunnen integreren in hun project.
Maar deze 3 opties zijn dus allemaal "goed", alleen is het net wat je zelf het prettigst vindt (of hebt afgesproken). Correct?
<?php
---------+---------+---------+---------+---------+---------+---------+---------+ */
$bar->setFoo(
'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
philosophi Graeco sermone tractavissent, ea Latinis litteris
mandaremus, fore ut hic noster labor in varias reprehensiones
incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
remissius agatur, sed tantum studium tamque multam operam ponendam in
eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
contemnentes Latinas, qui se dicant in Graecis legendis operam malle
consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
dignitatis esse negent.',
true,
false
);
?>
<?php
$bar->setFoo(
'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
philosophi Graeco sermone tractavissent, ea Latinis litteris
mandaremus, fore ut hic noster labor in varias reprehensiones
incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
remissius agatur, sed tantum studium tamque multam operam ponendam in
eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
contemnentes Latinas, qui se dicant in Graecis legendis operam malle
consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
dignitatis esse negent.',
true,
false
);
?>
<?php
$bar->setFoo(
'
Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
philosophi Graeco sermone tractavissent, ea Latinis litteris
mandaremus, fore ut hic noster labor in varias reprehensiones
incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
remissius agatur, sed tantum studium tamque multam operam ponendam in
eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
contemnentes Latinas, qui se dicant in Graecis legendis operam malle
consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
dignitatis esse negent.
',
true,
false
);
?>
Kwestie van smaak inderdaad. Ik noemde deze voorbeelden ook omdat de PSR-recommendation er geen duidelijk antwoord op geeft. Het zijn ook wel extreme voorbeelden, die in het wild weinig voorkomen.
De K&R-stijl is vernoemd naar Brian Kernighan en Dennis Ritchie, de auteurs van het beroemde standaardwerk The C Programming Language uit 1978. Dit wordt ook wel de One True Brace Style en afgekort 1TBS of OTBS genoemd:
<?
if ($iets) {
// <...>
}
?>
De Allman-stijl is vernoemd naar Eric Allman en ziet er zo uit:
<?
if ($iets)
{
// <...>
}
?>
Verwaarloosbaar detail, zou je misschien zeggen. Maar wacht tot we de code gaan uitbreiden.
Bij de K&R-stijl is duidelijk bij welke if een else hoort:
<?
if ($iets) {
// <...>
} else {
// <...>
}
?>
Bij de Allman-stijl kan de else echter uit beeld verdwijnen, letterlijk omdat je niet verder kijkt:
<?
if ($iets)
{
// <...>
}
else
{
// <...>
}
?>
In dat leidt tot ellende:
<?
if ($iets)
{
// <...>
}
/**
* Nieuwe blok PHP-code
*
* Oeps, nu gaat het fout! De Allman-stijl kan verwarrend zijn.
* Staat de if nu op zich? Of wordt de if nog gevolgd door een elseif of else?
*/
else
{
// <...>
}
?>
En ja: de PSR-recommendation gebruikt beide stijlen door elkaar :)
Nog een extra toevoeging van Ward. In de tijd dat programmeren net een beetje opkwam gebruikte zo'n beetje iedereen Vim. In vim heb je handige shortcuts waarbij je snel van het begin { naar het eind } kan bewegen, om zo bijv. snel de hele functie te kunnen kopiëren. Deze shortcuts werken alleen als de { of } op een nieuwe regel staan, vandaar dat dat vroeger voornamelijk werd gebruikt.
De PSR recommendation gebruikt ze door elkaar, maar niet willekeurig. Over het algemeen wordt de K&R stijl gebruikt, behalve bij classes en methods.