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 .