目次前のトピック次のトピックこのページ |
Zephirの紹介¶Zephir は、PHPによって実行することができるコードを書き込みおよびコンパイルしようとしているPHP開発者の主要なニーズに取り組む言語です。それは動的/静的な型で、機能のいくつかはPHP開発者が見慣れたものかも知れません。 Zephirという名前は Zend Engine/PHP/Intermediate の単語の短縮形です。これは発音が zephyr でなければならないことを示唆しますが、Zephirの作成者は実際のところはそれをzaefireと発音します。 Hello World!¶どのような言語も独自の “Hello World!” の例を持ちます。Zephirではこの紹介の例がいくつかのこの言語の重要な機能を紹介します。 Zephirでのコードはクラス内に置かれなければなりません。この言語はオブジェクト指向ライブラリ/フレームワークを作成することを目的としているため、クラス外のコードは許されません。また、namespace が必要です: namespace Test;
/**
* This is a sample class
*/
class Hello
{
/**
* This is a sample method
*/
public function say()
{
echo "Hello World!";
}
}
一度このクラスがコンパイルされると、gcc/clang/vc++によって透過的にコンパイルされた以下のコードを生成します: #ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_test.h"
#include "test.h"
#include "kernel/main.h"
/**
* This is a sample class
*/
ZEPHIR_INIT_CLASS(Test_Hello) {
ZEPHIR_REGISTER_CLASS(Test, Hello, hello, test_hello_method_entry, 0);
return SUCCESS;
}
/**
* This is a sample method
*/
PHP_METHOD(Test_Hello, say) {
php_printf("%s", "Hello World!");
}
実際には、Zephirを使う開発者がCを知っているか理解していることを期待されていませんが、もしコンパイラの経験、phpの内部あるいはC言語自身、があれば、Zephirと連携するときに開発者はもっと明らかな筋書を提供するでしょう。 一口のZephir¶以下の例では、十分な詳細説明するつもりです。あなたは何が起きているかを理解するでしょう。目的はユーザにZephirでのプログラミングがどのようなものであるか感触を与えることです。続く章で機能の詳細に分け入るつもりです。 以下の例はとても簡単で、配列の型をチェックする小さなプログラムを持つクラスとメソッドを実装します。 コードを詳細に調べてみましょう。つまり、Zephir構文を学び始めることができます。コードの数行だけで多くの詳細があります。一般的な考えをここで説明するつもりです: namespace Test;
/**
* MyTest (test/mytest.zep)
*/
class MyTest
{
public function someMethod()
{
/* 変数は宣言されなければなりません */
var myArray;
int i = 0, length;
/* 配列を生成する */
let myArray = ["hello", 0, 100.25, false, null];
/* 配列を 'int' 変数に数え上げる */
let length = count(myArray);
/* 値の型を出力する */
while i < length {
echo typeof myArray[i], "\n";
let i++;
}
return myArray;
}
}
メソッド内で、最初の行はローカルスコープ内での変数を宣言するために使われる‘var’ と ‘int’ キーワードを使います。メソッド内で使われる各変数はそれぞれの型を使って宣言されなければなりません。この宣言は任意では無く、ミスタイプの変数あるいは通常はラインタイムエラーになるスコープ外の変数の使用について、コンパイラがレポートするのに役立ちます。 動的変数はキーワード ‘var’ を使って宣言されます。これらの変数は異なる型へ割り当ておよび再割り当てすることができます。一方で、プログラム全体の実行を通じてその型の値だけを持つことができる ‘i’ および ‘length’ 数字static型変数があります。 PHPとは対照的に、変数名の前にダラー文字 ($) を置く必要はありません。 Zephir は Java, C#, C++ と同じようなコメント慣習に従います。//comment は行の最後まで行く一方で、/* comment */ は行の境界を跨ぐことができます。 変数はデフォルトで不変で、このことはZephirがほとんどの変数が不変であることを期待していることを意味します。初期の値を維持する変数はコンパイラによって静的な定数に最適化することができます。変数の値が変更される必要がある場合は、キーワード ‘let’ が使われるべきです。 /* 配列を生成 */
let myArray = ["hello", 0, 100.25, false, null];
デフォルトで配列はPHPのように動的で、それらは異なる型の値を含むかも知れません。PHPユーザランドからの関数をZephirコードの中で呼ぶことができます。例では関数 ‘count’ が呼ばれます。コンパイラはすでに配列のサイズをしっているため、この呼び出しを避けるような最適化を行うことができます: /* 配列を 'int' 変数にカウントします */
let length = count(myArray);
制御フロー文内の括弧は丸括弧は任意で、それが心地良ければ使うこともできます。 while i < length {
echo typeof myArray[i], "\n";
let i++;
}
PHPは動的な変数とのみ連携し、メソッドは常に動的な変数を返します。このことはもしPHP側で静的な型変数が返された場合、PHPコード内で使われるかも知れない動的変数を取得するだろうことを意味します。メモリは自動的にコンパイラによって管理されます。つまりCでのようにメモリを割り当てあるいは解放する必要が無く、PHPに似たような動作をすることに注意してください。 |