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 .