Vorlagenvererbung in Vanilla PHP in 35 Codezeilen?

Irgendwie bin ich auf ein Projekt in WordPress (WP) gestoßen, bei dem ich ein benutzerdefiniertes Thema erstellen musste. In WP sind Vorlagen nativ, was gut ist - Sie müssen keine zusätzliche Sprache lernen. Aber ich wollte unbedingt Vorlagen wie in Twig erben , und PHP kann das nicht sofort tun.





Es bleibt das Problem der Vererbung zu lösen. Nachdem ich das Problem untersucht hatte, wurde beschlossen, mich von der Phpti- Bibliothek inspirieren zu lassen , in der es einige Punkte gab, die ich wirklich beheben wollte:





  • Der Autor der Bibliothek schrieb: „Jeder Block wird immer ausgeführt!“ In Großbuchstaben, dh alle Blöcke werden ausgeführt, auch wenn sie überschrieben werden, und werden niemals ausgegeben.





  • - , , , - .





  • - . ob_start



    .





phpti startblock/endblock



import



:





<!--  -->
<?php startblock('blockName') ?>
    <!--     -->
<?php endblock() ?>
<!--  -->
      
      



index.php







<?php include 'layout.php' ?> <!--    -->

<?php startblock('blockName') ?>
    <!--   -->
<?php endblock() ?>
      
      



:





  • start/end . , .





  • . , , . . ?





  • , : , , .





, :





layout.php







// 
<!--  -->
<?php slot('blockName', function(){ ?>
    <!--     -->
<?php }) ?>
<!--  -->
      
      



index.php







<?php block('blockName', function(){ ?>
    <!--   -->
<?php }) ?>

<?php include 'layout.php' ?> <!--    -->
      
      



slot



block



, , , .





. , .





root.php



- , :





<!DOCTYPE html>
<html>
  <head>
    <title>
        <!-- '' -       -->
        <?php slot('title') ?>
    </title>
  </head>
  <body>
    <div id="root">
      <!--   ,      -->
      <?php slot('body', function () { ?>
        <p>'body' :: root.php</p>
      <?php }) ?>
    </div>
  </body>
</html>
      
      



two-columns.php



- :





<?php 
block('title', function () { ?> <!-- '' -      -->
  Title :: two-columns.php
<?php });

block('body', function () { ?>
  <div id="two-columnts">
    <div id="main">
      <?php slot('main', function () { ?> <!--    -->
        <p>'main' :: two-columns.php</p>
      <?php }) ?>
    </div>
    <div id="side">
      <?php slot('side', function () { ?>
        <p>'side' :: two-columns.php</p>
      <?php }) ?>
    </div>
  </div>
  <div id="footer">
    <?php slot('footer', function () { ?>
      <p>'footer' :: two-columns.php</p>
    <?php }) ?>
  </div>
<?php });
include './root.php'; //   root.php
      
      



index.php



- , :





<?php
require_once '../src/InheritTpl.php'; 

block('title', function () { ?> 'title' :: index.php <?php });

block('side', function () { ?>
  <p>'side' :: index.php</p>
<?php });

block('main', function () { ?>
  <div id="main-index"> <!--     -->
    <?php super() ?> <!--       -->
  </div>
<?php });

//     ,    ?
block('main', function () { ?>
  <div id="main-index"> <!--      -->
    <?php super() ?>
  </div>
<?php });

//  'footer'    

include './two-columns.php';
      
      



( ):





<!DOCTYPE html>
<html>
  <head>
    <title> 'title' :: index.php </title>
  </head>
  <body>
    <div id="root">
      <div id="two-columnts">
        <div id="main">
          <div id="main-index"> <!--     -->
            <div id="main-index"> <!--      -->
              <p>'main' :: two-columns.php</p>
            </div>
          </div>
        </div>
        <div id="side">
          <p>'side' :: index.php</p>
        </div>
      </div>
      <div id="footer">
        <p>'footer' :: two-columns.php</p>
      </div>
    </div>
  </body>
</html>
      
      



. , ?





Schreiben wir das obige Beispiel für die Phpti-Bibliothek neu. Geben wir ihr einen kleinen Vorsprung, weil Im Beispiel gibt es keine überschriebenen Schwergewichtsblöcke.





Wir werden die Zeit von 10.000 Renderings auf PHP 8.0.2 und einem 3,6-GHz-Prozessor vergleichen.





  • phpti: 0,831 Sekunden





  • Betreff: 0,353 Sekunden





Zusammenfassend können wir sagen, dass die Größe der Bibliothek um das Zehnfache reduziert wurde, während sich die Geschwindigkeit des Vererbungsmechanismus um mindestens das Zweifache erhöht hat.





Sie können den Quellcode hier anzeigen .








All Articles