[PHP]RSS 2.0 形式のフィードを作成するライブラリ

前回の記事で Atom 1.0 を作成するためのライブラリを作ったので、同じようにして RSS 2.0(Really Simple Syndication) フォーマットでの XML フィードを生成するライブラリを作ってみました。RSS 2.0 の主要な機能はカバーしていますが一部の機能は実装されていないので必要に応じて追加して下さい。

Download: rss2-1.0.1.zip

ライセンス上の制限はありませんが無保証ですのでご利用の際は自己責任で使用して下さい。(CC0)

・使用例

<?php
include_once 'Rss2/RssFeed.php';
include_once 'Rss2/RssItem.php';

$rss = new RssFeed();
$rss->title('サイトタイトル');
$rss->description('サイトの説明文です');
$rss->link('http://example.com/');
$rss->atomLink('http://example.com/rss.xml');

$item = new RssItem();
$item->title('記事1');
$item->description('ここに要約が入ります');
$item->link('http://example.com/1');
$item->guid('http://example.com/1');
$item->pubDate('2015-01-02 12:23:34');
$rss->addItem($item);

header('Content-type:application/rss+xml');
echo $rss->saveXML();

・出力結果

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>サイトタイトル</title>
    <description><![CDATA[サイトの説明文です]]></description>
    <link>http://example.com/</link>
    <atom:link href="http://example.com/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>記事1</title>
      <description><![CDATA[ここに要約が入ります]]></description>
      <link>http://example.com/1</link>
      <guid isPermaLink="true">http://example.com/1</guid>
      <pubDate>Fri, 02 Jan 2015 12:23:34 +0900</pubDate>
    </item>
  </channel>
</rss>

・RssFeed 主要メソッド

<channel>の内容に関する関数です。
必須項目は title, link, description です。

__construct(属性の配列)
save(保存先)
saveXML()
addItem(RssItemオブジェクト)
title(タイトル)
description(要約)
link(サイトURL)
atomLink(フィードURL)
pubDate(発行日時)
lastBuildDate(コンテンツ最終変更日時)
language(言語)
webMaster(メールアドレス)
managingEditor(メールアドレス)
copyright(著作権)
ttl(有効期限の「分」)
addCustomElement(要素名, 値, 属性の配列, CDATAの有無)

・RssItem 主要メソッド

<item>の内容に関する関数です。記事の分だけ作成します。
最低でも title か description のどちらかが必要です。

title(タイトル)
link(記事URL)
guid(一意な文字列, isPermaLink属性)
description(要約)
enclosure(添付ファイルのURL, ファイルサイズ, コンテンツタイプ)
comments(コメントページURL)
category(カテゴリー名)
author(作成者のメールアドレス)
dcCreator(作成者の名前)
addCustomElement(要素名, 値, 属性の配列, CDATAの有無)

作成したフィードを HTML ファイルからリンクするには <head> に次のタグを挿入します。

<link rel="alternate" type="application/rss+xml" title="タイトル" href="ファイルの場所" />

参考: RSS 2.0 at Harvard Law

[PHP]Atom 1.0形式のフィードを作成するライブラリ

PHP を使って Atom 1.0 形式でのフィードを自動生成する場合何らかのライブラリを使うのが一般的ですが、勉強も兼ねて自分で簡易なライブラリを作ってみました。
主要な機能は備えていますが RFC 4287 をすべてカバーしているわけではないので必要に応じて機能を追加して下さい。

Download
Ver. 1.1.1

特にライセンス上の制限は設けませんが、無保証ですのでご利用の際は自己責任で使用して下さい。(CC0)

・使用例

<?php
include 'AtomFeed.php';
include 'AtomEntry.php';

$atom = new AtomFeed(['xml:lang' => 'ja']);
$atom->title('Sample Website');
$atom->link('http://example.com');
$atom->link('http://example.com/feed', 'self');
$atom->id('http://example.com/feed');
$atom->updated('2015-01-01 12:23:45');
$atom->author([
    'name' => 'My Name',
    'email' => 'user@example.com'
]);

$entry = new AtomEntry();
$entry->title('タイトル 1');
$entry->link('http://example.com/1');
$entry->id('http://example.com/1');
$entry->summary('これは最初の記事です。');
$entry->updated('2015-01-02 03:04:05');
$entry->author([
    'name' => 'My Name',
    'email' => 'user@example.com'
]);
$atom->addEntry($entry);

$entry = new AtomEntry();
$entry->title('タイトル 2');
$entry->link('http://example.com/2');
$entry->id('http://example.com/2');
$entry->summary('2つ目の記事です。');
$entry->updated('2015-01-03 04:05:06');
$entry->author([
    'name' => 'My Name',
    'email' => 'user@example.com'
]);
$atom->addEntry($entry);

header('Content-Type: application/atom+xml');
echo $atom->saveXml();

・出力結果

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
  <title type="html"><![CDATA[Sample Website]]></title>
  <link href="http://example.com"/>
  <link href="http://example.com/feed" rel="self"/>
  <id>http://example.com/feed</id>
  <updated>Thu, 01 Jan 2015 12:23:45 +0900</updated>
  <author>
    <name>My Name</name>
    <email>user@example.com</email>
  </author>
  <entry>
    <title type="html"><![CDATA[タイトル 1]]></title>
    <link href="http://example.com/1" rel="related"/>
    <id>http://example.com/1</id>
    <summary type="html"><![CDATA[これは最初の記事です。]]></summary>
    <updated>Fri, 02 Jan 2015 03:04:05 +0900</updated>
    <author>
      <name>My Name</name>
      <email>user@example.com</email>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[タイトル 2]]></title>
    <link href="http://example.com/2" rel="related"/>
    <id>http://example.com/2</id>
    <summary type="html"><![CDATA[2つ目の記事です。]]></summary>
    <updated>Sat, 03 Jan 2015 04:05:06 +0900</updated>
    <author>
      <name>My Name</name>
      <email>user@example.com</email>
    </author>
  </entry>
</feed>

クラスファイル「AtomFeed.php」と「AtomEntry.php」をインクルードし、「new AtomFeed()」を使ってインスタンスを作ります。あとは項目ごとに AtomEntry を作成して 親となる AtomFeed に追加していきます。
主要なメソッドと引数は以下のとおりです。

・AtomFeed 主要メソッド

<feed> として必須なものは id、title、updated です。
サイト全体に関する情報を記入します。

__construct(属性の配列)
save(保存先)
saveXML()
title(タイトル, type属性)
subtitle(サブタイトル, type属性)
link(リンク先, rel属性, type属性, title属性, length属性)
updated(最終更新日時の文字列)
id(フィードURLなどの一意な文字列)
addCustomElement(要素名, 値, 属性の配列, CDATAの有無)

・AtomEntry 主要メソッド

<entry> として必須なものは id、title、updated です。
記事やページに関する情報を記入します。一つの entry がひとつの記事に対応しているので、記事数に応じて複数作成する必要があります。

title(タイトル, type属性)
link(href属性, rel属性, type属性, title属性, length属性)
updated(最終更新日時の文字列)
published(作成日時の文字列)
author(キー&値の配列)
contributor(キー&値の配列)
summary(要約, type属性)
content(本文, type属性, src属性)
category(term属性, scheme属性, label属性)
addCustomElement(要素名, 値, 属性の配列, CDATAの有無)

作成したフィードを HTML ファイルからリンクするには <head> に次のタグを挿入します。

<link rel="alternate" type="application/atom+xml" title="タイトル" href="ファイルの場所" />

参考サイト: 『The Atom Syndication Format』

[PHP]spl_autoload_register()を使ったクラスファイルの自動読み込みと名前空間(namespace)

通常、クラスを使用するにはクラスファイルを include() や require() で読み込む必要がありますが、クラス名とファイルの場所に一定のルールが有る場合、spl_autoload_register() を使って自動的に読み込める仕組みを作るのが便利です。

クラスファイルが同じフォルダ内に有る場合は次のようにします。

■index.php

<?php
spl_autoload_register(function($name){
	include __DIR__ . DIRECTORY_SEPARATOR . $name . '.php';
});

$sample = new Sample;
$sample->hello();

■Sample.php

<?php
class Sample
{
	function hello(){
		echo 'Hello, World!';
	}
}

spl_autoload_register() のコールバックにある $name には使おうとしているクラスの名前が渡されます。例の場合は「Sample」という文字列です。
あとはクラス名と同じ名前(クラス名 + .php)でクラスファイルを作り、それを読み込むようにしています。

大抵の場合クラスファイルは別のフォルダにまとめてあるので include の部分をフォルダ名を書き足せば常にそのフォルダ内から読み込まれることになります。

include __DIR__ . '/class/' . $name . '.php';

単純なものであれば上の方法で十分ですが、クラスフォルダの中にさらにフォルダが有り、その中にクラスファイルがある場合、名前空間(namespace)を利用すると綺麗にまとめられます。

例として「Vendor/Sub/Sample.php」を読み込むように修正してみます。

■index.php

<?php
use Vendor\Sub\Sample;

spl_autoload_register(function($name){
	$name = str_replace('\\', DIRECTORY_SEPARATOR, $name);
	include __DIR__ . DIRECTORY_SEPARATOR . $name . '.php';
});

$sample = new Sample;
$sample->hello();

■Vendor/Sub/Sample.php

<?php namespace Vendor\Sub;

class Sample
{
	function hello(){
		echo 'Hello, World!';
	}
}

index.php の先頭行に use を指定してあります。これをつけることにより、new Sample() を使う際にspl_autoload_register() の $name として「Vendor\Sub\Sample」が渡されるようになります。use は読み込むクラスに合わせて複数書くことができます。

それにあわせて Sample.php ファイルの先頭行にも名前空間として「namespace Vendor\Sub」を追加しました。厳密には名前空間はフォルダ名ではないのですが、ここではフォルダ名として使用できる書き方をしました。「Vendor\Sub」フォルダに入っているクラスファイルの先頭行には全てこの名前空間を使用します。
作法として名前空間のトップレベル(先頭部分)はベンダー名となるようにします。ベンダー名とはクラス提供者の名前や組織名などで、なるべく他者と被らないようなものをつけます。

名前空間をつけたファイル内で DateTime() などの名前空間を持たないクラス(グローバル空間内のクラス)を利用する場合、クラス名の頭に「\」をつけ、「new \DateTime()」のようにする必要があります。(「use \DateTime」と書いて「new DateTime()」のまま使うという手もあります)

また、use のあとに as を用いるとクラス名に別名(エイリアス)をつけることができます。

use SomeLongClassName as Example;
$example = new Example();

参考: 『PHP: 名前空間』