どういうわけか、カスタムテーマを作成する必要があるWordPress(WP)のプロジェクトに出くわしました。WPでは、テンプレートはネイティブです。これは良いことです。追加の言語を学ぶ必要はありません。しかし、私は本当にTwigのようにテンプレートを継承したかったので、PHPはそれをそのままでは実行できません。
相続の問題を解決することは残っています。問題を調査した後、phptiライブラリに触発されることになりました。このライブラリには、私が本当に修正したい点がいくつかありました。
ライブラリの作成者は、「すべてのブロックは常に実行されます!」と書いています。つまり、すべてのブロックは、オーバーライドされても実行され、出力されることはありません。
- , , , - .
- .
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>
. , ?
phptiライブラリの上記の例を書き直してみましょう。彼女に少し有利なスタートを切ってみましょう。この例には、重いオーバーライドされたブロックはありません。
PHP8.0.2と3.6GHzプロセッサでの10,000回のレンダリングの時間を比較します。
phpti:0.831秒
件名:0.353秒
結論として、ライブラリのサイズは10分の1に削減され、継承メカニズムの速度は少なくとも2倍に増加したと言えます。
ここでソースコードを見ることができます。