目次前のトピック次のトピックこのページ |
チュートリアル¶Zephir とこの本は、複雑では無いC拡張を作成したいPHP開発者を対象としています。 1つ以上のプログラム言語に経験があると仮定しています。PHP, C, Javascript およびほかの言語での特徴を比較します。これらの言語を知っている場合は、Zephirでの同様の機能と新しいあるいは異なる多くの機能を指摘するつもりです。 インストレーションのチェック¶Zephirのインストールが成功した場合は、以下のコマンドをコンソールで実行できる筈です: $ zephir help
全てがうまくいく場合は、以下のヘルプをスクリーンで見る筈です: _____ __ _
/__ / ___ ____ / /_ (_)____
/ / / _ \/ __ \/ __ \/ / ___/
/ /__/ __/ /_/ / / / / / /
/____/\___/ .___/_/ /_/_/_/
/_/
Zephir version 0.9.4a-dev
Usage:
command [options]
Available commands:
stubs Generates extension PHP stubs
install Installs the extension (requires root password)
version Shows the Zephir version
compile Compile a Zephir extension
api [--theme-path=/path][--output-directory=/path][--theme-options={json}|/path]Generates a HTML API
init [namespace] Initializes a Zephir extension
fullclean Cleans the generated object files in compilation
builddev Generate/Compile/Install a Zephir extension in development mode
clean Cleans the generated object files in compilation
generate Generates C code from the Zephir code
help Displays this help
build Generate/Compile/Install a Zephir extension
Options:
-f([a-z0-9\-]+) Enables compiler optimizations
-fno-([a-z0-9\-]+) Disables compiler optimizations
-w([a-z0-9\-]+) Turns a warning on
-W([a-z0-9\-]+) Turns a warning off
拡張のスケルトン¶最初にしなければならないことは、拡張のスケルトンを生成することです。これは作業を開始するのに必要な基本的な構造を拡張に提供するでしょう。この場合、“utils” という名前の拡張を生成するつもりです: $ zephir init utils
この後で、“utils” という名前のディレクトリが現在の作業ディレクトリに生成されます: utils/
ext/
utils/
ディレクトリ “ext/” (utils の中) はコンパイラによって拡張を生成するために使われるコードを含みます。作成されるもう一方のディレクトリは “utils” で、このディレクトリは拡張と同じものを持ちます。このディレクトリ内にZephirコードを配置するつもりです。 コードのコンパイルを開始するために、作業ディレクトリを “utils” に変更する必要があります: $ cd utils
$ ls
ext/ utils/ config.json
ディレクトリのリストは “config.json” という名前のファイルも表示するでしょう。このファイルはZephir および/あるいは この拡張の挙動を変更するために使うことができる設定を含みます。 最初のクラスの追加¶Zephir はオブジェクト指向の拡張を生成するように設計されています。機能の開発を開始するために、最初のクラスを拡張に追加する必要があります。 多くの言語/ツールと同じく、最初にしたいことはZephirによって生成される“hello world”を見て、全てがうまくいっていることをチェックすることです。そういうわけで、最初のクラスは “Utils\Greeting” という名前で “hello world!” を出力するメソッドを含んでいます。 このクラスのためのコードは “utils/utils/greeting.zep” の中に配置される必要があります: namespace Utils;
class Greeting
{
public static function say()
{
echo "hello world!";
}
}
これで、プロジェクトがコンパイルされる必要があり、拡張が生成される必要があることをZephirに伝える必要があります: $ zephir build
最初に、そして初回だけ、このクラスをPHP拡張にエクスポートするために必要なコードと設定を生成するために多くの内部コマンドが実行されます。もし全てがうまく行くと、以下のメッセージを出力の最後に見るでしょう: ...
Extension installed!
Add extension=utils.so to your php.ini
Don't forget to restart your web server
上の段階で、拡張をインストールするためにrootのパスワードを提供する必要があるかも知れません。最後に、PHPによってロードされるために、php.iniに拡張が追加される必要があります。これは初期化ディレクティブ: extension=utils.so をphp.iniに追加することで行われます。 最初のテスト¶これで、拡張がphp.iniに追加されました。以下を実行することで拡張が適切にロードされたかどうかをチェックします: $ php -m
[PHP Modules]
Core
date
libxml
pcre
Reflection
session
SPL
standard
tokenizer
utils
xdebug
xml
拡張が正しくロードされたことを示す、拡張 “utils” が出力の一部になければなりません。では、PHPによって直接実行された “hello world” を見てみましょう。これを行うために、作成したばかりの静的メソッドを呼び出す単純なPHPファイルを作成することができます:
echo Utils\Greeting::say(), "\n";
おめでとうございます!PHP上で実行する最初の拡張ができました。 便利なクラス¶“hello world” クラスは環境が正しいかをチェックするのに申し分ありませんでした。今度はもう少し便利なクラスを作ってみましょう。 この拡張に追加しようとする最初の便利なクラスは、ユーザにフィルタリングの機能を提供するでしょう。このクラスは “Utils\Filter” という名前で、そのコードは “utils/utils/filter.zep” に配置される必要があります: このクラスの基本的なスケルトンは以下の通りです: namespace Utils;
class Filter
{
}
クラスはユーザが文字列から不必要な文字をフィルタするのに役立つフィルタリングメソッドを含みます。最初のメソッドは “alpha” という名前で、その目的はascii基本文字だけをフィルタすることです。始めに、各バイトを標準出力に出力して文字列を横断だけしてみます: namespace Utils;
class Filter
{
public function alpha(string str)
{
char ch;
for ch in str {
echo ch, "\n";
}
}
}
このメソッドを呼び出す場合:
$f = new Utils\Filter();
$f->alpha("hello");
以下を見るでしょう: h
e
l
l
o
文字列内の各文字をチェックすることは簡単です。今度は正しくフィルタされた文字を持つもう一つの文字列を生成だけしてみます: class Filter
{
public function alpha(string str) -> string
{
char ch; string filtered = "";
for ch in str {
if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') {
let filtered .= ch;
}
}
return filtered;
}
}
完成したメソッドは前回のようにテストすることができます:
$f = new Utils\Filter();
echo $f->alpha("!he#02l3'121lo."); // prints "hello"
以下のスクリーンキャストで、このチュートリアルで説明された拡張を生成する方法を見ることができます: 結論¶これはとても単純なチュートリアルで、お分かりのようにZephirを使って拡張のビルドを開始することは簡単です。Zephirによって提供される追加の機能を見つけることができるように、マニュアルを読み続けることをお勧めします! |