Door
Cees S
op 14-02-2015 16:27
gewijzigd op 14-02-2015 17:53
2.707 views
Vond een snelle (OR) notatie wijze die ik met jullie wil delen.
Normale check bijvoorbeeld
<?php
If (isset($var)) {
$newValue = $var;
} else {
$newValue = 'some_value';
}
//normale if short notatie is dan
$newValue =(isset($var))?$var:'some_value';
//Een andere check die men zelden ziet is de OR check
isset($var)|| $var = 'some_value';
// als var leeg is krijgt het 'some_value'
$newValue = $var;
?>
Moeilijk is het niet en het geeft een goed leesbare vergelijking
Klopt in eerste instantie omdat hij met boolean komt, nu heb ik haken geplaatst en moet het ook met toewijzing werken. De meest simpele werkt zonder meer en heb ik veelvuldig in gebruik.
Na de extra haken zou dit $newValue = ((isset($var)) || 'some_value'); ook moeten werken
Goed gezien Ward. Dit zal nooit werken aangezien je bij een positieve test de output van isset in $newValue stopt. En isset geeft altijd een boolean terug.
@Cees S: wellicht voortaan eerst even testen voordat je dit soort constructies plaatst ;)
Klopt, even in mijn eigen sources moeten kijken en het gewijzigd.
Het blijft volgens mij wel een hele mooie vergelijking
werkend in gebruik is
<?php
$config['width'] = 150;
isset($config['width']) || $config['width'] = 120;
echo $config['width'];// even een echo voor result, nu 150, if config['width'] not set 120
?>
?>
[size=xsmall]Toevoeging op 14/02/2015 18:02:57:[/size]
Er is zoiets als kortere code... en er is zoiets als leesbaarheid.
Ik kan niet direct overzien wat er in zo'n "OR" statement gebeurt, en wat gebeurt er als een assignment "false" oplevert?
Als ik dit soort code zie zou mijn eerste ingeving zijn om weg te sturen van zo'n opzet, en de desbetreffende programmeur vragen stellen over zijn beweegredenen voor het schrijven van onleesbare code.
Ik zie eigenlijk nou niet echt het nut om iets zo te controleren.
Even vertalen naar simpel Nederlands:
$config['width'] = 150; $config breedte = 150.
Als $config breedte geset is, (Dat is ie al, want hij heeft een waarde van 150)
OF $config with heeft een waarde van 120
Laat $config with zien.
Hier gaat iets mank. Want waarom wil je in hemelsnaam iets wat al een vaste waarde heeft een controle of hij daadwerkelijk wel bestaat. Dat is niet logisch.
Dan ga je nog een stapje verder:
Je maakt een nieuwe variabele aan die je eerst controleert of hij bestaat, OF een waarde heeft van 120.
Dan is het eigenlijk wel logisch dat de variabele de eerste controle doet, de tweede controle is niet meer van belang. Dus de variabele word een boolean.
Maar wat wil je bereiken?
Want ik heb het idee dat je iets aan het zoeken bent wat veeeeeeel makkelijker kan.
<?php
isset($config['width']) || $config['width'] = 120;
?>
Hierin geeft isset() true of false.
Indien true dan hoeft de rest achter de OR niet meer te worden uitgevoerd en blijft $config['width'] ongewijzigd..
Indien false dan wordt de rest wel uitgevoerd. $config['width'] krijgt een (nieuwe) waarde. En een gelukte toekenning geeft true.
<?php
$var = (isset($config['width']) || $config['width'] = 120);
?>
Idem als hierboven.
Echter het resultaat, dus of true of false, dat stop je in $var.
Maar het resultaat van een toekenning is toch tevens de toegekende waarde?
$whatever = false; (dit statement)
is equivalent met
false
Hoe moet ik de toekenning van een ongeinitialiseerde variabele met een waarde die "equivalent" is met false interpreteren in dit geval?
false || false
lolwut?
Het probleem is dat niet direcht duidelijk is wat de bedoeling van de programmeur is. Dan moet je nadenken over:
- wat de bedoeling (waarschijnlijk) was en
- of dit ook daadwerkelijk gebeurt (variabelen na afloop altijd een correcte waarde hebben)
Dit lijkt mij ook geen handige aanpak indien er hier of elders bugs in je scripts zitten. Het resultaat van debugging hiervan zal waarschijnlijk (en hopelijk) resulteren in het weg-refactoren van dit soort constructies.
EDIT: de crux van dit alles is waarschijnlijk dat je lazy evaluation op een verkeerde manier gebruikt (misbruikt).