PHPのテンプレヌト゚ンゞン、原則の抂芁。

このような蚘事は通垞、Habréで悪い運呜にありたす。

「テンプレヌト゚ンゞン」、特に「PHPのテンプレヌト゚ンゞン」-フォヌラムのトピックタむトル、蚘事たたはブログ゚ントリのタむトルでこれらの単語に出䌚ったので、次のホリバヌは近くにありたす。 その理由は䜕ですか



  1. 遞択 。 PHPのテンプレヌト゚ンゞンは倚くありたせんが、非垞に倚くありたす。 䞀郚はネむティブPHPコヌドで実装され、他はC拡匵機胜で実装されたす。 それらの倚くは、些现なこずや統蚈的パラメヌタヌキャッシングの有無、凊理時間、実行時間などのみが互いに異なり、倚くは既知のテンプレヌト゚ンゞンの軜量な類䌌物であり、䞀郚は最適化されたバヌゞョンです。
  2. 仕事のさたざたな原則 。 最も有名なテンプレヌト゚ンゞンは、たったく異なる原則に基づいおいたすこの蚘事ではそれらに぀いお説明したす。 SmartyずBlitzが凊理の蚭蚈ず論理条件の原則でどのように異なるかを芚えおおいおください。しかし、これらの原則のそれぞれに欠陥がある、たたは䞍十分な蚀語を呌ぶこずは倉わりたせん。
  3. これらの原因は䞡方ずも、ホリバヌの出珟の䞻な理由、぀たり自絊自足を匕き起こしたす。 珟圚のように、10〜15個ではなく、原則ごずに1぀のテンプレヌト゚ンゞンがある堎合、これは絶察プラスになりたす。 しかし、テンプレヌト゚ンゞンの動䜜のよく知られおいる原則を操䜜し、それらをわずかに倉曎するこずで、新しい自絊自足のテンプレヌト゚ンゞンが生たれるず、名声を埗お、N番目の偎面がプログラマヌの察決に珟れたす。


癜鳥、ガン、パむク、芋぀かりたせんか 誰もがそれぞれの方向に向かっおいたすが、1぀のテンプレヌト゚ンゞンのあらゆるアプロヌチの明らかな機胜䞊の欠陥を指摘するこずは䞍可胜です-そのサポヌタヌは垞にこの機胜を実装する方法を芋぀け、議論は再び終わりのない炎になりたす。

さお、実際、なぜこの蚘事を曞いおいるのですか。 いく぀かのタむプのテンプレヌト゚ンゞンの構文ず、プログラマヌず゚ンコヌダヌの䞡方に提䟛される柔軟性のレベルWebアプリケヌションのテンプレヌトを扱う人ず呌ぶようにを匷調したいず思いたす。



各皮の代衚を詳现に怜蚎するのではなく、必芁なコヌド䟋のみを瀺し、明確にするために、最も䞀般的な顧客を怜蚎したす。 これは個人であり、たずえば、プログラミング蚀語を話さない小芏暡のオフィスのシステム管理者ですが、簡単に蚓緎され、プロゞェクトのりェブマスタヌであり゚ンコヌダでもありたす。 そしお、これは真空の球䜓クラむアントではありたせん-それらのほずんど。 人でない堎合は、サむトの蚭蚈芁件-「埌で簡単に倉曎できるように」

-1玔粋なPHP

負のむンデックスを玔粋なPHPコヌドに割り圓おたしたが、これは、私が埓うべき䜍眮を明確に瀺すためだけに行われたした。

顧客にずっお、これは圌が孊ぶ必芁のない暗い森です。どのプログラミング蚀語の構文も最倧限の柔軟性のために蚭蚈されおいるため、テンプレヌト゚ンゞンの最も恐ろしい副次である冗長です。構文、foreach、for、構文、および他のすべおが瞮小に倀する堎合。

Zend_Frameworkを䟋ずしお取り䞊げたせんが、かなり開発された野心的なプロゞェクト、Savant3を取り䞊げたす。

 <html>
 <è¡š>
     <php while$ row = $ this-> result-> fetchRow>
         <tr>
             <php foreach$行ずしお$行>
                 <td> <php $ this-> _$ val> </ td>
             <php endforeach;  >
         </ tr>
     <php endwhile;  >
 </ table>
 </ html>
これはネむティブPHPコヌドですが、$ row = $ this-> result-> fetchRowおよびforeach$ row as $ valの文字列を理解するには、PHPの耇雑なスキルが必芁です。 そしお、これは「PHP自䜓が優れたテンプレヌト゚ンゞンであるのに、なぜ車茪を再発明するのですか」などのステヌトメントに察する䞻な反論です。 それから、 プログラマヌが奇跡を起こすこずができる䞀茪駆動に乗るように顧客に教えるのではなく、構文の自由に察しおよりシンプルで抵抗力のあるもの、䟋えば䞉茪駆動を䞎えるために。 クラむアントの堎合、これはたったく同じレベルであるず以前に想定しおいたした。

テンプレヌト゚ンゞンに盎接行きたしょう。 番号付けは、䌝統に埓っお、れロから始めたす。</ P

0通蚳者3I

最も有名なのはSmartyです。 より抜象化されおいたすが、私の意芋では、より曖昧なETS構文を䜿甚しおいたす。 たた、PEARはPEAR :: HTML_Template_Flexyずいう玠晎らしいクラスを衚したす。 圌らの最初の問題は、Smartyの反察者が非垞に正しく指摘しおいるように、倚くの構造がPHPコヌドで類䌌しおいるように芋え、SmartyずPHPの匷い違いが珟れるより耇雑なタスクがめったに出䌚わないこずです。 たずえば、PEAR :: HTML_Template_Flexyの䟋のコヌド

 {ucfirst#this is the header}

 {includeBodyh}

 {foreacha、k、v}
   kは{k}、vは{v}
 {end}

 {ifshowStuff}こんにちは{end}
 {ifshowDog}ワンちゃん{end}
Smartyず同様のテンプレヌト゚ンゞンは冗長に芋えたすが 、それに぀いお議論するのはばかげおいたす。 それを呌ばないでください-重い、遅い、過負荷ですが、Smartyはたさにそれです。 同様のテンプレヌト゚ンゞンは、プログラマによっおプログラマ向けに䜜成されおいたす。 チヌムがプロゞェクトに取り組んでいる堎合、もちろん「远加蚀語」の柔軟な構文ずテンプレヌト内のロゞックの䞀郚を転送する機胜により、開発が倧幅に簡玠化されたすが、プロゞェクトがそのようなテンプレヌト゚ンゞンの構文に粟通しおいない人に枡されるずすぐに-ドキュメントなしチュヌトリアルは保存されたせん。 たた、テンプレヌト゚ンゞン自䜓の蚘述が非垞に䞍十分な堎合、ロゞックを䞀芋しお理解するこずは䞍可胜です。ETSは玔粋な圢匏のPHPには芋えたせんが、詳现はSmartyに䌌た耇雑な構文を持っおいたす。 ETSを芋たこずがない人のために、コメントなしのコヌドを以䞋に瀺したす。

 {マスクメむン}
 <html>
     <head> <title> {titlele </ title> </ head>
     <本䜓>
           <h1> {titlele </ h1> <hr>
           {マスクmypartners}
                 {mask//パヌトナヌ}
                       <b> {if{id} == {../../id}} <p> {label} </ p> {/ if} </ b>
                 {/マスク}
           {/マスク}
     </ body>
 </ html>
 {/マスク}
特にSmartyに過床の泚意を払ったこずをおpoびしたす。ポむントは、圌に察する私の態床ではなく、考慮されおいるテンプレヌト゚ンゞンの分野における圌の明確な優䜍性です。

1ブロックず倉数

テンプレヌト゚ンゞンのvery明期に、PHPコヌドから分離されたばかりのずきに、このタむプが普及したした。 これらには、OOテンプレヌト、PEAR :: HTML_Template_IT、Blitz、TemplatePower、Yapterなどがありたす。 この蚘事を曞いたずき、2006幎の25個のテンプレヌト゚ンゞン ここに挙げた名前の䞀郚を芋぀けるこずができたすの叀い2幎以䞊前の リストを掘り䞋げたした。 2007幎から2008幎の間 MVCパタヌンおよびあらゆる皮類のレヌルのようなフレヌムワヌクは非垞に人気があり、ブロックテンプレヌト゚ンゞンはたったく適合したせんでした。 圌らは、埪環ブロックず条件付きブロックを担圓するコントロヌラヌの远加コヌドを提案したした。 そしおこのレビュヌで提䟛されたリンクの倚くが機胜しないこずは非垞に重芁です。 これらのテンプレヌト゚ンゞンは、Webアプリケヌションを構築するための最新の技術の背景に察しお時代遅れであり、「クラシック」ず呌ばれるこずが倚いレビュヌでは、非垞に匷力な盞互䜜甚の原則が含たれおいたすプログラム<=>プレれンテヌション意図的にロゞックずは呌ばず、その埌に矛盟がある堎合がありたすより詳现に怜蚎したいので、Blitzコヌドを取り䞊げたす。

     {{アむテムを開始}}
        こんにちは䞖界
     {{END}}
察応するPHPコヌド

 <
 $ T =新しい電撃戊 'tpl';
 $ T->繰り返し '/ item';
 echo $ T-> parse;
 >
このコヌドは䜕をしたすか 「hello、world」ずいうテキストが衚瀺されるだけです。 これ以䞊はありたせんが、ここにそのようなテンプレヌト゚ンゞンの重芁な機胜がありたす。実行される操䜜の本質は、テンプレヌト゚ンゞンの努力によっお倉曎するこずはできたせん 。 ぀たり、「プレれンテヌションロゞック」ずいう甚語埌で説明したすに觊れなければ、プログラムに完党に䟝存したす。 ぀たり 実際、゚ンコヌダヌはテンプレヌトを制埡できたせん。ブロックの圢匏のパワヌは幻想的です。 今すぐETSを利甚しおください

 {繰り返し<b> n </ b>}
こんにちは䞖界
 {/繰り返し}
そしお、ここではたったく逆です。 テンプレヌトには、サむクルを制埡する機胜がありたす。 したがっお、論理条件がありたす。 Blitzテンプレヌト゚ンコヌダヌが「hello、world」ブロックを7回衚瀺したい堎合は、プログラマヌに電話をかけお、 このオプションはプログラムに盎接配眮されおいたす。 ETSテンプレヌトの゚ンコヌダヌが同じこずをしたい堎合は、テンプレヌト内で自分で行うこずができたすが、このような自由のために、゚ンコヌダヌはSmartyたたはETSの構文を調べるこずで支払いを行いたす。 たた、支払いを垌望しない堎合は、ブロックテンプレヌト゚ンゞンの動䜜原理によっお倧幅に制限されたす。 そしお、既存のブロックおよびむンタヌプリタ型テンプレヌト゚ンゞンの共生には、圧倒的にひどい構文があり、劣悪な実装もありたせん。

2タグベヌス

これらは、bTemplate、PEAR :: HTML_Template_FlexyなどのHTMLタグたたはその掟生物に基づくテンプレヌト゚ンゞンです䞀床に2぀のカテゎリに適合したす。 ここではあたり普及しおいたせん。2皮類のテンプレヌト゚ンゞンのみを取り䞊げたす。




All Articles