PHP immediate if

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ruuhl
  • Registratie: Oktober 2006
  • Laatst online: 02-12-2024
Hallo allen,
ik heb de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
<?php

define('PROFILING', true);

(PROFILING ? $start = time() : '');

usleep(2000000); // sleep 2 seconds

echo (PROFILING ? 'verstreken: ' . time() - $start . ' sec' : '');


Maar dit geeft 2 problemen:
- Hij geeft een groot negatief getal
- Hij toont "verstreken: " niet maar " sec" wel

Wanneer ik eerst het tijdsverschil bereken en het daarna pas echo...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

define('PROFILING', true);

(PROFILING ? $start = time() : '');

usleep(2000000); // sleep 2 seconds

if (PROFILING)
{
  $timediff = time() - $start;
  echo 'verstreken: ' . $timediff . ' sec';
}


...toont hij wel de string ervoor en het juiste aantal seconden

1) Waarom werkt het eerste geval niet?
2) Wat is het netste om als 3e parameter van de iif op te geven, zodat hij niets doet? '' of null of iets anders? continue werkt niet..

Alvast bedankt! _/-\o_

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:16

crisp

Devver

Pixelated

http://www.php.net/manual....operators.precedence.php

. + en - hebben dezelfde precedence en zijn left-associative

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Operator precedence. De '-' is van hetzelfde niveau als de '.'

[ Voor 30% gewijzigd door .oisyn op 13-11-2009 11:03 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Ruuhl
  • Registratie: Oktober 2006
  • Laatst online: 02-12-2024
Thanks. Ik heb haakjes om de berekening gezet en nu werkt hij wel _/-\o_

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wel raar eigenlijk, om string concatenatie dezelfde precedence te geven. Je wilt juist dat ie lager is dan de mathematische operators. De gevallen waarbij je bij a . b + c wilt dat a.b eerst wordt uitgevoerd zijn ontzettend zeldzaam.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Ruuhl
  • Registratie: Oktober 2006
  • Laatst online: 02-12-2024
.oisyn schreef op vrijdag 13 november 2009 @ 11:12:
Wel raar eigenlijk, om string concatenatie dezelfde precedence te geven. Je wilt juist dat ie lager is dan de mathematische operators. De gevallen waarbij je bij a . b + c wilt dat a.b eerst wordt uitgevoerd zijn ontzettend zeldzaam.
Ja dat vind ik dus ook..

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ruuhl schreef op vrijdag 13 november 2009 @ 10:58:
Hallo allen,

2) Wat is het netste om als 3e parameter van de iif op te geven, zodat hij niets doet? '' of null of iets anders? continue werkt niet..
Ik gebruik meestal false.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
waarom zou je een ternary operator gaan misbruiken als control structure? Gebruik gewoon een if statement.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Grijze Vos schreef op vrijdag 13 november 2009 @ 12:17:
waarom zou je een ternary operator gaan misbruiken als control structure? Gebruik gewoon een if statement.
Ik vindt het wel grappig lijken, op zich.

Maar in dit geval blijf je wel hebben dat hij (bijvoorbeeld) altijd een echo uitvoert, zelfs als profiling uit staat.

PHP:
1
if (profiling) echo 'verstreken: ' . time() - $start . ' sec';


is wel korter overigens.

Een alternatief is om een eenvoudige 'log()' functie te schrijven:

code:
1
2
3
4
5
function log($message) {
if (profiling) {
echo $message;
}
}


(heel rudimentair voorbeeld). Zo kun je de voorwaarde ('if profiling') centraal houden, en kun je de opmaak of opslag van je log makkelijk aanpassen (bijvoorbeeld zodat hij het in een DB opslaat, of een logbestand)

Maar dat zijn allemaal details.

Overigens, in Java krijg je gewoon een keiharde compiler error.

[ Voor 3% gewijzigd door YopY op 13-11-2009 14:13 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Omdat je in Java (en in C#) niet zomaar elke expression als statement kunt gebruiken. Ook moet je er rekening mee houden dat in strong typed talen de typen van de expressies links en rechts van de : met elkaar compatible moeten zijn.

Zo kan het trouwens ook:
PHP:
1
PROFILING && print('verstreken: ' . (time() - $start) . ' sec');

[ Voor 27% gewijzigd door .oisyn op 13-11-2009 14:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
mja, als je dan per se een compactere methode wil gebruik dan de &&, maar wat mij betreft bouw je daar ontzettend ranzige onleesbare code mee.

edit:
ik bedenk me net overigens dat if(PROFILING) X slechts 2 karakters meer werk is dan PROFILING && X.

[ Voor 27% gewijzigd door Grijze Vos op 13-11-2009 16:11 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Ik ben het roerend eens met grijze vos. Je moet het niet moeilijker maken dan het is. Als je een IF wilt uitvoeren zonder ELSE dan is de ? : notatie verwarrend.
Pagina: 1