Lütfen PHP Yorumlu Notation'ý kullanarak yanlısı ve eksileri nedir?

6 Cevap php

Ben daha önce böyle bir şey görmemiştim. Yani, bir süre beni karıştırıyor. Ama şimdi anlıyorum ve bazen kullanmak. Yani, kısa deneyimden sonra, herkes sizin PHP Yorumlu Notation'ý kullanarak yanlısı ve eksileri nedir bana söyleyebilir?

$stringval = <<<MYHEREDOC

   just creating variable here. nothing more.

MYHEREDOC;

Şahsen, nasıl bu PHP özelliğini kullanırım? Bu kodlama ya da iyi bir şekilde kötü bir yolu var mı?

6 Cevap

Bunu kullanmak zaman% 99, SQL sorguları için örneğin bulunuyor:

$sql = <<<END
SELECT *
FROM sometable
WHERE value > 100
ORDER BY name
END;

Ben daha kolay kaynak kodu gibi sorguları spot ve bunları çalıştırmak için bir şey onları kopyalamak ve yapıştırmak için bulabilirsiniz. Sizin kilometre değişebilir. Note: normal dizeleri ile multi-line yapabilirsiniz. Ben ilk satırı geri kalanı için farklı girintili olarak ancak bu önlemek eğilimindedir.

En büyük "yanlısı" olarak bana kalırsa gibi tırnak kaçmak gerek kalmamasıdır. Bu özellikle biçimlendirme ile ilgili bir sorun var. Okunması kolay olduğu kendiniz karar verin. Varsayarsak:

$name = 'foo';
$type = 'text';
$value = 'Default value';

Version 1: single quotes

$html = '<input type="' . $type . ' name="' . $name . '" value="' . $value . '">';

Version 2: double quotes

$html = "<input type=\"$type\" name=\"$name\" value=\"$value\">";

Version 3: heredoc

$html = <<<END
<input type="$type" name="$name" value="$value">
END;

Note: 2. sürümünde size elbette kaçan sorunu çözmek için bir nitelik değerleri için tek tırnak kullanabilirsiniz ama nokta bu gibi şeyler hakkında endişelenmenize gerek edilir. Şahsen ben de biçimlendirme nitelik alıntı türlerini karıştırmak sevmiyorum.

Şimdi iki tür vardır "Yorumlu metin:"

  • Heredoc, tırnak benzer "" yaratılış kendi değerine herhangi değişkenleri çevirecektir. Bu onlara (\ n, \ t gerek yoktur) ihtiyacınız tam aralık / getiri koyarak için çok yararlıdır.
  • Nowdoc, tek işaretleri gibi '' NOT tüm değişkenleri ve mağazalar sadece metin değeri dönüştürmek. Bu (yorumlu metin aksine) sınıf değişkenleri varsayılan değerler kullanılabilir.

Yorumlu metinler Örnek:

$value = 5;
$string = <<<EOL
The number is $value
EOL;
// The number is 5

Yorumlu metin Örnek:

$value = 5;
$string = <<<'EOL'
The number is $value
EOL;
// The number is $value

EDIT: Aklıma tek dezavantajı bitiş karakterleri (örneklerde, EOL) MUST 0 boşluklarla önlerine olmasıdır. Bu hatırlamak zor ve çirkin görünüyor zaman iç içe işlevleri içinde:

function foo() {
  if ($bar) {
    $string = <<<LINE
Hey, how is it going, $name.
This is a great test of Heredoc and Nowdoc.
Blah blah blah, go upvote me!
LINE;
  }
}

Peki, pro (ler)

  • o tırnak ile metin büyük boyutta için kullanışlı

ve eksilerini

  • nadiren hiç MVC metin büyük boyutta gerekiyorsa
  • tatili girinti
  • bazı tuhaflıklar vardır (önceki 5.3) sınıflar kullanılırsa

Şahsen, ben bunu kullanmıyorum.

(Bütün bu tercihi, vs vs bir mesele olmanın zorunlu bir reddi)

Ben bunu hiç kullanmayın. Perl hiçbir HTML kaçış özelliği vardı gibi, Perl oldukça yararlı oldu. Yani, PHP yapar ve ben metin büyük miktarda yazdırmak istiyorsanız, ben sadece yakın PHP etiketi ve olduğu gibi bir metin yazın ederim. Diğer herhangi bir durumda eski iyi çift tırnak bana uyuyor.

Heredoc bir değişken metnin büyük lekeler damping için çok yararlı, veya doğrudan müşteriye dışında. Uzun bir çok satırlı dize kadar bina eğer o da size birçok concatenations kaydeder. Yalnızca ana dezavantajı Eğer ekleme olacak hiçbir veri-sürecini önceden ihtiyaç vardır.

echo <<<EOF
<input type="text" name="foo" value="$bar" />

EOF;

özellikle sözdizimi vurgulama editörü, çok okunabilir. Ancak (tırnak kaçış için) htmlspecialchars'dan ile ön işlem $ bar () DIŞ veyaada heredoc gerekiyveya, bu yüzden sizinle sonuna kadar:

$bar = htmlspecialchars($bar);
echo <<<EOF
etc....

Eğer "html" modunda iseniz, kullanabilirsiniz oysa:

<input type="text name="foo" value="<?php echo htmlspecialchars($bar) ?>" />

veya

echo '<input type ... snip ... value="' . htmlspecialchars($bar) . etc....

Generally you don't need to stveyae the escaped version of the data, so you might as well dump it out directly and save yourself the variable assignment step. HEREDOCs don't let you do that, as you can't insert a function call into them directly.

Bu php ile çok temiz bir programlama tarzı Ayrılan html olması çok yararlıdır. Php kodları çok okunabilir ve anlamak daha kolay olacaktır. Bu önemli ölçüde debbuging kodları kolaylaştırır. Bu programın mantığı yerine html ile sunum üzerinde daha fazla konsantre sağlar. Sadece yerine tüm üzerinde html içinde can sıkıcı php komut birden yankı deyimi gerekir. Bu varlık kullanımı nasıl göstermek için, burada bir örnektir.

masterpage.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title><?php $title ?></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="../js/jquery.min.js" type="text/javascript"></script>
        <link href="../bsa.css" rel="stylesheet" type="text/css">
         <script language="javascript" type="text/javascript" src="../js/sortEligibility.js"></script>
     <body>
            <div id="maincontainer">        
    <div id="menu">
                <ul id="navtop">
                    <li><*linkhere* title="Home">Home</a></li>
                    <li >*linkhere* title="Eligibility">Eligibility</a></li>
                    <li >*linkhere*  title="Registration  List">Registration</a></li>
                    <li ><*linkhere*" title="BSA Ranks and Requirements ">BSA Ranks</a></li>
                    <li><*linkhere*  title="Merit Badges">Merit Badges</a></li>                   
                </ul>
            </div>

            <div id='contentcolumn'>
                <?php  echo "<h2>".$title."</h2>".$bodyhtml;?>
                 </div>
            <div id="footer">Footer</div>
        </div>
    </body>
</html>

meritBadges.php

<?php
//include dbase connection
include("*linkhere*/includes/dbconnect.php");
//this page is called where the  value id_scout is sent through GET
//Show required output
$result = mysql_query("SELECT e.id_merit, m . *
FROM bsa_merits AS m
LEFT JOIN bsa_earned_merits AS e ON e.id_merit = e.id_merit
WHERE id_scout = '{$_GET[id_scout]}'");
while($row = mysql_fetch_assoc($result)){
    $body .=<<<__HTML_END
<td align="center"><img_src="*linkhere*/MeritBadges_Files/{$row['filename']}"><br>{$row['merit']}</td>
__HTML_END;       
}
if(!empty($body)){
$bodyhtml =<<<__HTML_END
Earned Merits:
<table border="0" cellpadding="5" cellspacing="0">
<tr>
$body
</tr>
</table>
__HTML_END;
}
else{
die ("There is nothing to display");
}
mysql_free_result($result);
$title="Merit Badges" ;
include("masterpage.php");
?>

All other pages may be created in similar fashion with the above example. Remember you just create one big string for your output and display it in your hmtl file with just one echo! Just analyze the above codes and see how you can improve your php programming with heredoc!