Warisan template di vanilla PHP dalam 35 baris kode?

Entah bagaimana saya menemukan proyek di WordPress (WP), di mana saya perlu membuat tema khusus. Di WP, templatnya asli, yang bagus - Anda tidak perlu mempelajari bahasa tambahan. Tapi saya benar-benar ingin mewarisi template seperti di Twig , dan PHP tidak bisa melakukannya di luar kotak.





Itu tetap untuk menyelesaikan masalah warisan. Setelah mempelajari masalahnya, diputuskan untuk terinspirasi oleh pustaka phpti , di mana ada beberapa poin yang benar-benar ingin saya perbaiki:





  • Penulis perpustakaan menulis β€œSetiap Blok Selalu Dieksekusi!” Dalam huruf kapital, semua blok dieksekusi, bahkan jika mereka diganti, dan tidak akan pernah menjadi keluaran.





  • - , , , - .





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



. , ?





Mari tulis ulang contoh di atas untuk pustaka phpti. Mari kita beri dia sedikit permulaan, karena tidak ada blok kelas berat yang diganti dalam contoh ini.





Kami akan membandingkan waktu 10.000 render pada PHP 8.0.2 dan prosesor 3.6GHz.





  • phpti: 0.831 detik





  • subjek: 0,353 detik





Sebagai kesimpulan, kami dapat mengatakan bahwa ukuran perpustakaan telah dikurangi 10 kali lipat, sedangkan kecepatan mekanisme pewarisan telah meningkat setidaknya 2 kali lipat.





Anda dapat melihat kode sumbernya di sini .








All Articles