Herança de template no vanilla PHP em 35 linhas de código?

De alguma forma me deparei com um projeto no WordPress (WP), onde precisava fazer um tema personalizado. No WP, os modelos são nativos, o que é bom - você não precisa aprender um idioma adicional. Mas eu realmente queria herdar modelos como no Twig , e o PHP não pode fazer isso fora da caixa.





Resta resolver a questão da herança. Depois de estudar o problema, decidi se inspirar na biblioteca phpti , na qual havia alguns pontos que eu realmente queria corrigir:





  • O autor da biblioteca escreveu “Cada bloco é sempre executado!” Em letras maiúsculas, ou seja, todos os blocos são executados, mesmo que sejam sobrescritos, e nunca serão produzidos.





  • - , , , - .





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



. , ?





Vamos reescrever o exemplo acima para a biblioteca phpti. Vamos dar a ela uma pequena vantagem, porque não há blocos sobrescritos pesados ​​no exemplo.





Compararemos o tempo de 10.000 renderizações no PHP 8.0.2 e um processador de 3,6 GHz.





  • phpti: 0,831 segundos





  • assunto: 0,353 segundos





Como conclusão, podemos dizer que o tamanho da biblioteca foi reduzido em 10 vezes, enquanto a velocidade do mecanismo de herança aumentou pelo menos 2 vezes.





Você pode ver o código-fonte aqui .








All Articles