[PHP] Function call met array onverwacht resultaat

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • S.O.
  • Registratie: Januari 2012
  • Laatst online: 25-01-2021
Ik was bezig met het maken van een validate functie en zag een aparte reactie die ik niet verwachte.
Hieronder de test code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$array = array (1,2,3,4,5,6);

function test ($array){
  if (empty (validate ($array)) || validate ($array) !== true) {
    echo "<br>Error<br>";
    return false;
  }
}

function validate($array){
  echo "<pre>";
  print_r ($array);
  echo "</pre>";
  return true;
}

test ($array);


Waarom krijgen we 2x een array bij de print_r functie?
Als ik regel 17 op return false zet, krijg ik maar 1 array terug.
Ook wanneer ik 1 van de if statements verwijder krijg 1 array te zien.
In de php.net manual heb ik al lopen zoeken bij functies, if statements of de logical operators ed. maar kan de vinger er niet achter krijgen als php hobbyist.
En blijkbaar kan ik opk de juist google term niet vinden om dit uitgelegd te krijgen.

Heeft iemand een idee wat ik moet googlen om dit uitgelegd te krijgen wat hiervan de oorzaak is?

Grt S.O.

Beste antwoord (via S.O. op 18-10-2020 09:17)


  • Johnny
  • Registratie: December 2001
  • Laatst online: 10:36

Johnny

ondergewaardeerde internetguru

S.O. schreef op zaterdag 17 oktober 2020 @ 23:14:
Ik was bezig met het maken van een validate functie en zag een aparte reactie die ik niet verwachte.
Hieronder de test code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$array = array (1,2,3,4,5,6);

function test ($array){
  if (empty (validate ($array)) || validate ($array) !== true) {
    echo "<br>Error<br>";
    return false;
  }
}

function validate($array){
  echo "<pre>";
  print_r ($array);
  echo "</pre>";
  return true;
}

test ($array);


Waarom krijgen we 2x een array bij de print_r functie?
Als ik regel 17 op return false zet, krijg ik maar 1 array terug.
Dat is omdat je if statement een OR bevat. Dat houdt in dat de condities worden uitgevoerd totdat de eerste TRUE als resultaat geeft.

Wanneer de functie validate() false teruggeeft zal de empty() functie dat herkennen als leeg. Omdat het dus wel leeg is, is deze conditie true en hoeft de volgende conditie niet meer te worden uitgevoerd omdat aan de eerste van de twee is voldaan.
Ook wanneer ik 1 van de if statements verwijder krijg 1 array te zien.
Er is maar één if statement, deze bevat twee condities.
In de php.net manual heb ik al lopen zoeken bij functies, if statements of de logical operators ed. maar kan de vinger er niet achter krijgen als php hobbyist.
En blijkbaar kan ik opk de juist google term niet vinden om dit uitgelegd te krijgen.

Heeft iemand een idee wat ik moet googlen om dit uitgelegd te krijgen wat hiervan de oorzaak is?

Grt S.O.
Wat je moet doen:
1. Lezen wat empty() doet met verschillende waarden.
2. empty() niet gebruiken op een functie die alleen true/false (boolean) teruggeeft.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 16:19

Onbekend

...

Op regel 4 roep je twee keer de functie validate aan, en beide keren wordt in die functie print_r gebruikt.

[ Voor 7% gewijzigd door Onbekend op 17-10-2020 23:17 ]

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
Je doet nu een:
PHP:
1
if(empty(true)) ...

Ik denk niet dat dat is wat je bedoelde ;)

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • bcome
  • Registratie: September 2013
  • Laatst online: 18:19
CurlyMo schreef op zaterdag 17 oktober 2020 @ 23:17:
Je doet nu een:
PHP:
1
if(empty(true)) ...

Ik denk niet dat dat is wat je bedoelde ;)
Om hier even verder op in te gaan:
code:
1
2
php > var_dump(empty(true));
bool(false)

Als de eerste conditie in een if clausule false is, zal de tweede clausule geprobeerd worden. Daarom wordt de functie validate() twee keer aangeroepen.

[ Voor 0% gewijzigd door bcome op 17-10-2020 23:21 . Reden: output PHP REPL geupdatet ]


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
Onbekend schreef op zaterdag 17 oktober 2020 @ 23:17:
Op regel 4 roep je twee keer de functie validate aan, en beide keren wordt in die functie print_r gebruikt.
Misschien voor jou ten overvloede. Dan tenminste voor het brede publiek :)

Dat is de instinker. Normaal gesproken zou een of conditie alleen zoveel evalueren als nodig. Als de eerste conditie true is dan zou er niet meer verder gekeken hoeven te worden. Dat heet Wikipedia: Short-circuit evaluation

Alleen moet de eerste conditie wel doen wat je wil. Nu klopt die eerste conditie niet, waardoor je alsnog twee evaluaties van validate ziet.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
bcome schreef op zaterdag 17 oktober 2020 @ 23:20:
[...]

Om hier even verder op in te gaan:
code:
1
2
php > var_dump(empty(true));
bool(false)

Als de eerste conditie in een if clausule false is, zal de tweede clausule geprobeerd worden. Daarom wordt de functie validate() twee keer aangeroepen.
Zet deze er dan gelijk bij ;)
# echo "<?php var_dump(empty(false)); ?>" | php
bool(true)


Dan weet TS ook waarom het bij een return false anders is.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 10:36

Johnny

ondergewaardeerde internetguru

S.O. schreef op zaterdag 17 oktober 2020 @ 23:14:
Ik was bezig met het maken van een validate functie en zag een aparte reactie die ik niet verwachte.
Hieronder de test code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$array = array (1,2,3,4,5,6);

function test ($array){
  if (empty (validate ($array)) || validate ($array) !== true) {
    echo "<br>Error<br>";
    return false;
  }
}

function validate($array){
  echo "<pre>";
  print_r ($array);
  echo "</pre>";
  return true;
}

test ($array);


Waarom krijgen we 2x een array bij de print_r functie?
Als ik regel 17 op return false zet, krijg ik maar 1 array terug.
Dat is omdat je if statement een OR bevat. Dat houdt in dat de condities worden uitgevoerd totdat de eerste TRUE als resultaat geeft.

Wanneer de functie validate() false teruggeeft zal de empty() functie dat herkennen als leeg. Omdat het dus wel leeg is, is deze conditie true en hoeft de volgende conditie niet meer te worden uitgevoerd omdat aan de eerste van de twee is voldaan.
Ook wanneer ik 1 van de if statements verwijder krijg 1 array te zien.
Er is maar één if statement, deze bevat twee condities.
In de php.net manual heb ik al lopen zoeken bij functies, if statements of de logical operators ed. maar kan de vinger er niet achter krijgen als php hobbyist.
En blijkbaar kan ik opk de juist google term niet vinden om dit uitgelegd te krijgen.

Heeft iemand een idee wat ik moet googlen om dit uitgelegd te krijgen wat hiervan de oorzaak is?

Grt S.O.
Wat je moet doen:
1. Lezen wat empty() doet met verschillende waarden.
2. empty() niet gebruiken op een functie die alleen true/false (boolean) teruggeeft.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • S.O.
  • Registratie: Januari 2012
  • Laatst online: 25-01-2021
Bedankt iedereen voor de input.

De opmerkingen van Johnny deden bij mij een belletje rinkelen.

!== true houdt volgens mij in dat alles anders dan de true value wordt gezien als false.
Aangezien ook empty niet gelijk aan true is hoeven we niet te apart te controleren op empty, Dit is dus een overbodige check aangezien we dit al doen.

Grt S.O.

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
empty() is vrijwel altijd een overbodige check. Er zijn ongetwijfeld uitzonderingen maar over het algemeen is het een code-smell.

Edit: wat ook ontzettend kan helpen is je functies typehinten. Als je bijvoorbeeld je validate() functie return type Boolean geeft, zie je in één oogopslag dat je niet allerlei sanity checks nodig hebt. Je kunt dan zelfs het stricte "!== true" achterwege laten en volstaan met "if (! validate()){}"

[ Voor 54% gewijzigd door mcDavid op 18-10-2020 09:32 ]

Pagina: 1