Here is your culprit:

 RETVAL_LONG(matched);

The declaration in the docs says the function returns an int.  However, the
text of the doc says that the function returns True or False.

Changing your call to:

$match = (bool)preg_false(); /* prints alpha always */

gives you the results you want.

Andrei, you are listed as the author on this file.  What needs to change?
The return type?  That would make the most sense to me.

Brian Moon
----------------------------------------------------------------------
dealnews.com, Inc.
Makers of dealnews, dealmac
http://dealnews.com/ | http://dealmac.com/


----- Original Message -----
From: "chrism" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Saturday, June 30, 2001 7:02 PM
Subject: [PHP-DEV] switch, equality and preg_match


> I encountered a problem where the result of a preg_match was FALSE.
> This was fed into a switch statement - and I believe PHP executed the
> the wrong case section.
>
> I've tracked this down to preg_match not really returning FALSE
> combined with SWITCH executing the first case statement always on either
> a numeric 0 or BOOLEAN TRUE.
>
> As a consequence of auto type conversion, you can't mix
> STRING/NUMERIC/BOOLEAN within a switch.  And with the preg_match issue,
> you can't assume all input into your switch will be of one TYPE (BOOLEAN).
>
> Aside from changing functions to return real booleans....
>
> 1. Should type conversion be turned off inside switch() ?
> 2. If 0 == FALSE then why 0 == "ANYTHING" ?
>
> Chris
>
> <?
>
> /* auto type conversion is the root of my switch problem */
>
> if (0 == "ONE") echo "one\n"; /* TRUE */
> if (1 == "TWO") echo "two\n"; /* FALSE */
> if (TRUE == "THREE") echo "three\n"; /* TRUE */
> if (FALSE == "FOUR") echo "four\n"; /* FALSE */
>
> if (TRUE == 0) echo "hopefully not\n";
>
> function preg_false() {
> return(preg_match("/no/", "dXiuehXX"));
> }
>
> /* note the difference between FALSE and preg_false() */
>
> // $match = TRUE; /* prints alpha always */
> // $match = 0; /* prints alpha always */
> // $match = FALSE; /* prints gamma section */
> $match = preg_false(); /* prints alpha always */
>
> if(is_bool($match) == TRUE)  echo "match is boolean\n";
>
> switch($match) {
> case "ALPHA":
> echo "hmm.. alpha\n";
> break;
> case "BETA":
> echo "hmm.. beta\n";
> break;
> case 0:
> echo "hmm.. gamma\n";
> break;
> case TRUE:
> echo "hmm.. TRUE\n";
> break;
> case FALSE:
> echo "hmm.. FALSE\n";
> break;
> }
>
> ?>
>
> --
> PHP Development Mailing List <http://www.php.net/>
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> To contact the list administrators, e-mail: [EMAIL PROTECTED]
>
>
>


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to