ごもちゃ箱BLOG

自作の PHP クラスライブラリ PEACH の開発日記です。

汎用PHPクラスライブラリ PEACH の ver 1.0.0 をリリースしました

詳しくはコチラを参照してください!

ドキュメント
XML, HTML 出力支援モジュール Markup
ソースコードのダウンロード (ZIP)
https://github.com/trashtoy/PEACH/archive/1.0.0.zip

What's new?

今回、新しく Markup というモジュールを作りました。文字通り HTML や XML の出力をサポートします。
例えば HTML を出力する場合のサンプルコードはこんな感じ。

<?php
require_once("/path/to/PEACH/src/autoload.php");

Peach_Markup_Html::alias(); // 関数 tag() を定義
echo tag("p")->append("This is test")->write();

このコードは以下の文字列を出力します。

<p>This is test</p>

jQuery みたいにサクサク使えます。

<?php
require_once("/path/to/PEACH/src/autoload.php");

Peach_Markup_Html::alias(); // 関数 tag() を定義
$div = tag("div")->attr("class", "test");
tag("p")->append("This is test")->appendTo($div);
tag("ul")
    ->append(tag("li", ["id" => "first"])->append("Hogehoge"))
    ->append(tag("li", ["id" => "second"])->append("Fugafuga"))
    ->append(tag("li", ["id" => "third"])->append("Piyopiyo"))
    ->appendTo($div);

echo $div->write();
?>

このコードは以下を出力します。

<div class="test">
    <p>This is test</p>
    <ul>
        <li id="first">Hogehoge</li>
        <li id="second">Fugafuga</li>
        <li id="third">Piyopiyo</li>
    </ul>
</div>

インデントは、あたかも手書きでコーディングした感じに自動的に調整されます。改行場所を細かくカスタマイズすることもできます。

きっかけ

作ったきっかけなんですが、例えばこんな感じの PHP と HTML のインデントが入り混じったソースをメンテしていて嫌気が差したり

<?php if ($users): ?>
    <?php if ($isTable): ?>
<table>
    <tr>
        <th>ID</th>
        <th>名前</th>
    </tr>
        <?php foreach ($users as $user): ?>
    <tr>
        <td><?php echo $user->getID() ?></td>
        <td><?php echo $user->getName() ?></td>
    </tr>
        <?php endforeach; ?>
</table>
    <?php else: ?>
<ul>
        <?php foreach ($users as $user): ?>
    <li><?php echo $user->getName(); ?></li>
        <?php endforeach; ?>
</ul>
    <?php endif; ?>
<?php endif; ?>

タグの属性の部分がこんな感じにごちゃごちゃしたり (条件に応じて readonly 属性を付与する部分とか、特に)

<p><input type="text" name="hoge"
    value="<?php echo $value; ?>"<?php if ($isPreview): ?> readonly<?php endif; ?>>

typo のせいで HTML が invalid になったり、などなど。

HTML と PHP を混在させずに、全部 PHP で出力させてしまえば良いのだ!と思い、自分にとって理想的な API を作りました。
欠点は WEB デザイナーさんが手を入れにくくなってしまうことかな。

FAQ

PHP 5.5 がリリースされて、もうすぐ PHP 5.6 が出てくるだろうという時期なのに、namespace 対応してないの?

今回リリースしたバージョン 1.0.0 は、対応スペックを PHP 5.1.1 以上としているので……。
namespace 以外にもクロージャとか Generator とか使いたい箇所は多々あるんですが。
これも制作スピードが遅すぎるせいです。ちなみに作り始めたのは今から 4 年前くらい。

ver 2.0.0 では対象バージョンを PHP 5.3.0 以上とし、namespace を使って全クラスを書き直します。