2014-10-17 96 views
0

我很驚訝地發現你可以將PHP函數分解爲原始HTML並返回。我知道你可以用循環和條件來做這種事情,但這對我來說是一個驚喜。這是一個意外還是這個明確定義的行爲? (我在手冊中找不到關於功能案例的任何明確的討論。)您何時可以混合使用HTML和PHP,是否有任何限制?

[注意:以下代碼沒有給出我何時會使用此行爲的一個很好的示例,但我保持它對演示目的]

<?php 

$i = 0; 

while($i++ < 3) { 
    ?><p>I am in a while loop.</p><?php 
} 

// this part surprised me 
function actSkeptical($adjective) { 
    ?><p>Is it <?= $adjective ?> that this works?.</p><?php 
} 

actSkeptical("weird"); 
?> 

輸出:

I am in a while loop. 

I am in a while loop. 

I am in a while loop. 

Is it weird that this works? 

我知道有些人很討厭混合PHP和HTML這樣的,但我不能做OOP /模板(對於原因,我不會進入這裏),我喜歡儘可能多地查看原始HTML。

此外,我不太瞭解上面的短打開/關閉標記(輸出$adjective)如何與周圍的代碼一起工作的語義。 PHP是否僅僅將原始HTML視爲echo聲明?然後<?= $adjective ?>就像在一個字符串中包含一個變量?

+0

您正在查看PHP的行爲。這並不漂亮,我不建議這樣編碼,但如果您認爲有必要,可以利用它。基本上,PHP並不關心''標籤之外的任何內容,PHP之外的任何內容都會發送到瀏覽器。 – Crackertastic 2014-10-17 04:55:58

+0

http://php.net/manual/en/language.basic-syntax.phpmode.php – 2014-10-17 04:57:08

+0

@Tieson謝謝,但我讀過,不幸的是它沒有提及函數。 – 2014-10-17 05:01:22

回答

1

我似乎無法找到與PHP標籤的塊中的退出任何文件。但是,實際上只有少數轉義HTML的地方可行。

  1. 正常使用

    <?php 
    
        php_related_code(); 
    
    ?> 
    
    //html/css/js/etc 
    
  2. 內的塊,如同時,對,功能等

    <?php 
    
    for ($i = 0; $i < 5; $i++) { 
        ?> 
    
        hello world 
    
        <?php 
    } 
    
    $i = 5; 
    while ($i-- > 0) { 
        ?> hello there <?php 
    } 
    
    function myFunc() { 
    ?> 
        hello universe 
    <?php 
    } 
    
    myFunc(); 
    

你能想到的?>stuff<?php類似回聲或打印命令在PHP中找到,因爲你可以在相同的地方轉義回HTML。所以你可以在主腳本中回顯,在for循環中,你可以在函數中回顯。但是你不能在一個陣列呼應,例如:

<?php 

$array = array(echo "here"); //not allowed 
$array = array(?>here<?php); //also not allowed 

所以可以認爲逃脫相同的作爲呼應的,它可以告訴你哪裏你可以使用它,但你不能做同樣的事情,當你想到什麼它。

它們的行爲不同,並且由PHP處理的方式也不同。但你的問題只是詢問任何限制,所以我不會介紹?><?phpecho之間的區別。

我忘了提及,<?=$variable?>只是<?php echo $variable; ?>的簡寫標籤,如果您啓用了此功能。

+0

感謝您的解釋。我想我必須相信,他們不會在未來的更新中破壞任何功能(因爲它是部分無證的行爲),但這對許多事情都是如此。 – 2014-10-17 05:25:39

+0

我會建議創建一個小型模板引擎,基本上它不會轉義爲HTML,您只需擁有PHP代碼和HTML,並且PHP將通過readfile/etc簡單調用HTML。正如其他人所指出的那樣,在PHP和HTML之間切換會產生無法維護的代碼,所以我希望這是將您的代碼添加到列表中的另一個原因,因爲您不應該在代碼中執行此操作。 – 2014-10-17 05:29:23

+0

我主要同意你的看法,但我並不是代碼的主要開發人員,因此添加模板引擎帶來的複雜性/抽象層不是一種選擇。儘管如此,我會盡量保持混音。 – 2014-10-17 06:04:51

0

這被稱爲意大利麪代碼。不要使用它。

如果你真的想分開代碼,邏輯和標記開始使用MVC; YII很棒。

http://www.yiiframework.com/

還檢查了這一點:https://www.youtube.com/watch?v=mhwfFgSzg7U

+1

我欣賞溫柔的「微調」,但正如我在問題中所述,目前我無法使用框架,原因我在這裏不會詳述。這不是一個答案。 – 2014-10-17 04:56:02