Héritage de template en PHP vanille en 35 lignes de code?

D'une manière ou d'une autre, je suis tombé sur un projet sur WordPress (WP), dans lequel je devais créer un thème personnalisé. Dans WP, les modèles sont natifs, ce qui est bien - vous n'avez pas besoin d'apprendre une langue supplémentaire. Mais je voulais vraiment hériter de modèles comme dans Twig , et PHP ne peut pas le faire immédiatement.





Il reste à résoudre la question de l'héritage. Après avoir étudié le problème, il a été décidé de s'inspirer de la bibliothèque phpti , dans laquelle il y avait quelques points que je voulais vraiment corriger:





  • L'auteur de la bibliothèque a écrit «Chaque bloc est toujours exécuté!» En majuscules, c'est-à-dire que tous les blocs sont exécutés, même s'ils sont remplacés, et ne seront jamais affichés.





  • - , , , - .





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



. , ?





Réécrivons l'exemple ci-dessus pour la bibliothèque phpti. Donnons-lui une petite longueur d'avance, car il n'y a pas de blocs surchargés lourds dans l'exemple.





Nous comparerons le temps de 10 000 rendus sur PHP 8.0.2 et un processeur à 3,6 GHz.





  • phpti: 0,831 secondes





  • sujet: 0,353 seconde





En conclusion, on peut dire que la taille de la bibliothèque a été réduite de 10 fois, tandis que la vitesse du mécanisme d'héritage a augmenté d'au moins 2 fois.





Vous pouvez voir le code source ici .








All Articles