PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

while> <elseif
Last updated: Sun, 25 Nov 2007

view this page in

Εναλλακτική σύνταξη για τις δομές ελέγχου

Η PHP προσφέρει μια εναλλακτική σύνταξη για ορισμένες από τις δομές ελέγχου της, δηλαδή για τις, if, while, for, foreach, και switch. Σε κάθε περίπτωση, η βασική μορφή της εναλλακτικής σύνταξης είναι η αλλαγή της παρένθεσης ανοίγματος με την άνω και κάτω τελεία (:) και της παρένθεσης κλεισίματος με τα endif;, endwhile;, endfor;, endforeach;, ή endswitch;, αντίστοιχα.

<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>

Στο παραπάνω παράδειγμα, το μπλοκ της "A is equal to 5" είναι εμφωλευμένο μέσα σε μια έκφραση if γραμμένη με τον εναλλακτικό τρόπο σύνταξης. Το μπλοκ της HTML θα εμφανιστεί μόνο αν η $a είναι ίση με 5.

Η εναλλακτική σύνταξη εφαρμόζεται και στο else και elseif . Η ακόλουθη δομή είναι μια δομή if με elseif και else με την εναλλακτική σύνταξη:

<?php
if ($a == 5):
    print 
"a equals 5";
    print 
"...";
elseif (
$a == 6):
    print 
"a equals 6";
    print 
"!!!";
else:
    print 
"a is neither 5 nor 6";
endif;
?>

Βλέπε επίσης τα while, for, και if για επιπλέον παραδείγματα.



while> <elseif
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
Εναλλακτική σύνταξη για τις δομές ελέγχου
tmont
01-Jun-2008 03:17
In response to the note concerning references below, his point is taken, albeit in the wrong context.  According to the section on references (http://www.php.net/manual/en/language.references.return.php), returning by reference means you return a variable by reference, not an expression.  The ternary operator is an expression, which is why his example doesn't work (it also generates an E_NOTICE, "Only variable references should be returned by reference...").

I mentioned the wrong context because the ternary operator has nothing to do with alternative syntax (e.g. if: ... endif;); it is its own alternative to the alternative.  As it were.

Word.
protractor at gmx dot net
28-Apr-2008 08:21
If you use alternative syntax beware that references will be broken.
I hope this helps someone.

example:

<?php
class myclass
{
    public
$arr = NULL;
    public function &
get($name) // should return a reference
   
{
       return isset(
$this->arr[$name]) ? $this->arr[$name] : NULL;
    }

    public function &
get_by_ref($name) // returns a reference
   
{
        if(isset(
$this->arr[$name]))
        {
          return
$this->arr[$name];
        }else{
          return
NULL;
        }
    }
}

$cl = new myclass();
$cl->arr['a'] = 'a';
$out =& $cl->get('a');
echo
$out; // a
$cl->arr['a'] = 'b';
echo
$out; // a

$cl = new myclass();
$cl->arr['a'] = 'a';
$out =& $cl->get_by_ref('a');
echo
$out; // a
$cl->arr['a'] = 'b';
echo
$out; // b
?>
Anonymous
21-Apr-2008 09:59
to martin at rootshell dot cz:

It is called short-circuit evalution same as in C/C++, Javascript, etc.

It is stated here:

http://www.php.net/manual/en/language.operators.logical.php

Another use of this "feature" is like this:

<?php

// Long Version:
if(!empty($_REQUEST["name"])) $name = $_REQUEST["name"];
else
$name = "Anonymous";

// Can be written as:

($name = @$_REQUEST["name"]) or ($name = "Anonymous");

?>
martin at rootshell dot cz
09-Apr-2008 04:31
What about this ?? And it's actually works.

<?php

$filename
= '/path/to/data-file';
$file = fopen ($filename, 'r')
    or die(
"Can't open the file ($filename)");

?>
jeremia at gmx dot at
28-Jan-2008 06:52
If you wan't to use the alternative syntax for switch statements this won't work:

<div>
<?php switch($variable): ?>
<?php
case 1: ?>
<div>
Newspage
</div>
<?php break;?>
<?php
case 2: ?>
</div>
Forum
<div>
<?php break;?>
<?php
endswitch;?>
</div>

Instead you have to workaround like this:

<div>
<?php switch($variable):
case
1: ?>
<div>
Newspage
</div>
<?php break;?>
<?php
case 2: ?>
</div>
Forum
<div>
<?php break;?>
<?php
endswitch;?>
</div>
php dot net at eoasys dot com
24-Oct-2007 03:03
In response to spa:

Yeah, that's for sure! Seems so obvious, but remains a tough sell... I avoid the "Bracket Racket", and use it only where the (ahem) "Clearer Syntax" wasn't implemented.

A further improvement would be a "Noun-Verb" form of end structures. Such as:

if (...):
  while (...):
    ...
    if (...):
      ...
      ...
    ifend;
    ...
  whileend;
ifend;

This would make it yet another level of easier to tell which block end you're looking at. ;-)
spa
16-Oct-2007 04:40
In response to virtuall:

The end_; structure sometimes makes it easier to tell which block statement end you are looking at.  It's much harder to tell which nested block a } belongs to than an end_;
php dot net at eoasys dot com
18-Sep-2007 04:57
Amen to what "atw" said.

It's really amazing how off-topic many notes on this page are. It is specifically about ENDcontrol structures. Of the twelve notes below, only one even mentions the word END. Perhaps only three or four are directly on-topic!
oly at czo dot net
27-Jun-2007 01:59
3 Lines to make table row colors alternate.  Could be used for other applications as well.

<?
//1. Initialize alternating variable.
$alt_color=true;

while($row=mysql_fetch_array($result)){
  //2. If alt var true set one color if false set the other.
  echo (($alt_color) ? "<tr bgcolor=\"#ffffff\">\n" : "<tr bgcolor=\"#D9E5F1\">\n");
  echo "<td>echo $row['id'];;</td>\n";
  echo "</tr>\n";
  //3. Alternate the variable value;
  (($alt_color) ? $alt_color=false : $alt_color=true);
}
?>
geekman at Textbook Torrents dot com
01-Apr-2007 03:09
The bug in your example is user error.

<?
$foobar = 2;

echo 'Foobar is ' . ($foobar == 2) ? 'foo' : 'bar';
// outputs 'foo';

echo 'Foobar is ' . (($foobar == 2) ? 'foo' : 'bar');
// outputs 'Foobar is foo';
?>

When using the ? : operators you should always wrap the entire thing in parentheses to avoid the problem you describe. By my understanding, the issue an extension of your example:

<?
$pet-type = 1;
$pet-name = 'Mittens';

echo 'My ' . ($pet-type == 1) ? 'cat' : 'puppy' . 'dog' . '\'s name is ' . $pet-name . '.';
// returns 'cat'

echo 'My ' . (($pet-type == 1) ? 'cat' : 'puppy' . 'dog') . '\'s name is ' . $pet-name . '.';
// returns 'My cat\'s name is Mittens.'
?>

You see that without parentheses the parser has no way of differentiating between the false case and the rest of the string.
fernandoleal at dragoncs dot com
03-Feb-2007 11:17
If you need nested ifs on I var its important to group the if so it works.
Example:
<?php
//Dont Works
//Parse error: parse error, unexpected ':'
 
$var='<option value="1" '.$status == "1" ? 'selected="selected"' :''.'>Value 1</option>';
 
//Works:
 
$var='<option value="1" '.($status == "1" ? 'selected="selected"' :'').'>Value 1</option>';

echo
$var;
?>
atw
03-Nov-2006 04:47
As "qbolec" states, all the notes below which use the "?" are actually references to the ternary operator (http://uk.php.net/operators.comparison").

Whilst this is kind of relevent, it probably shouldn't be in this section.
Neil
29-Sep-2006 12:08
as skippy noted above this is very useful stuff for interspersed php & html. Here is alternative syntax example using a bitwise comparison to set checkboxes on and off to prefill a permissions bitmask calculator form:
<?
$bitmask = 481683;
?>
.... [yada yada yada]....
<input type="checkbox" name="SOME_PERMISSION_VARIABLE" value="32768" <? echo($bitmask & 32768 ? "checked" : ""); ?>>Can perform some operation<br/>
<input type="checkbox" name="SOME_OTHER_PERMISSION_VARIABLE" value="65536" <? echo($bitmask & 65536 ? "checked" : ""); ?>>Can perform some other operation<br/>

You supply a bitmask, and it prechecks all the permissions the user has so you don't need to remember what they already have to recheck them all individually.

It's much more elegant than traditional if's.
davidforest at gmail dot com
19-Oct-2005 06:26
If you need a tidy way to do a lot of condition testing, switch statement will do the job well:

switch (true){

    case ($a>0):
                     //do sth;
                     break;
    case ($b>0):
                     //do sth;
                     break;
    case ($c>0):
                     //do sth;
                     break;
    case ($d>0):
                     //do sth;
                     break;

}
skippy at zuavra dot net
27-Jun-2005 04:32
If it needs saying, this alternative syntax is excellent for improving legibility (for both PHP and HTML!) in situations where you have a mix of them.

Interface templates are very often in need of this, especially since the PHP code in them is usually written by one person (who is more of a programmer) and the HTML gets modified by another person (who is more of a web designer). Clear separation in such cases is extremely useful.

See the default templates that come with WordPress 1.5+ (www.wordpress.org) for practical and smart examples of this alternative syntax.
siebe-tolsma at home dot nl
18-Mar-2004 10:22
As a rection on sttoo, if you use nested if's a bit different they are less likely to cause mistakes:
[EDITOR'S NOTE: Referenced Note has been removed]

<?php
$one
= true;
$two = true;

$result = ($one ? "one" : ($two ? "two" : "none"));    // $result is "one"

$one = false;
$result = ($one ? "one" : ($two ? "two" : "none"));    // $result is "two"

$two = false;
$result = ($one ? "one" : ($two ? "two" : "none"));    // $result is "none"

?>
i a m 4 w e b w o r k at hotmail dot com
12-Oct-2003 04:38
Good tutorial on using alternative control structure syntax at:
http://www.onlamp.com/pub/a/php/2001/05/03/php_foundations.html?page=1

while> <elseif
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites