¿Herencia de plantillas en PHP vanilla en 35 líneas de código?

De alguna manera me encontré con un proyecto en WordPress (WP), donde necesitaba hacer un tema personalizado. En WP, las plantillas son nativas, lo cual es bueno: no es necesario que aprenda un idioma adicional. Pero realmente quería heredar plantillas como en Twig , y PHP no puede hacer eso de inmediato.





Queda por resolver el tema de la herencia. Después de estudiar el problema, se decidió inspirarme en la biblioteca phpti , en la que había un par de puntos que tenía muchas ganas de solucionar:





  • El autor de la biblioteca escribió “¡Cada bloque se ejecuta siempre!” En letras mayúsculas, es decir, todos los bloques se ejecutan, incluso si se anulan, y nunca se mostrarán como salida.





  • - , , , - .





  • - . 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>
      
      



. , ?





Reescribamos el ejemplo anterior para la biblioteca phpti. Démosle una pequeña ventaja, porque no hay bloques anulados de peso pesado en el ejemplo.





Compararemos el tiempo de 10,000 renderizaciones en PHP 8.0.2 y un procesador de 3.6GHz.





  • phpti: 0,831 segundos





  • tema: 0.353 segundos





Como conclusión, podemos decir que el tamaño de la biblioteca se ha reducido en 10 veces, mientras que la velocidad del mecanismo de herencia se ha incrementado al menos 2 veces.





Puede ver el código fuente aquí .








All Articles