目次前のトピック次のトピックこのページ |
演算子¶Zephirの演算子のセットはPHPのそれらと似ており、それらの挙動のいくらかも継承します。 比較演算子¶比較演算子は比較される変数の型に依存します。例えば、もし比較される両方のオペランドが動的な変数の場合、その挙動はPHPと同じです:
例: if a == b {
return 0;
} else {
if a < b {
return -1;
} else {
return 1;
}
}
論理演算子¶以下の演算子がサポートされます:
例: if a && b || !c {
return -1;
}
return 1;
ビット演算子¶以下の演算子がサポートされます:
例: if a & SOME_FLAG {
echo "has some flag";
}
php マニュアルで動的な変数の比較についてもっと学べます。 三項演算子¶ZephirはCあるいはPHPで利用可能な三項演算子をサポートします: let b = a == 1 ? "x" : "y"; // a が 1 に等しい場合に b は "x" が割り当てられます。そうでなければ "y" が値として割り当てられます
特別な演算子¶以下の演算子がサポートされます: Empty¶この演算子は表現が空かどうかを調べることができます。‘Empty’ は表現がnull、空文字、あるいは空の配列であることを意味します: let someVar = "";
if empty someVar {
echo "is empty!";
}
let someVar = "hello";
if !empty someVar {
echo "is not empty!";
}
Isset¶この演算子はプロパティあるいはインデックスが配列あるいはオブジェクト内で定義されたかどうかを調べます: let someArray = ["a": 1, "b": 2, "c": 3];
if isset someArray["b"] { // 配列がインデックス "b" を持つかどうかをチェックします
echo "yes, it has an index 'b'\n";
}
返り値表現として ‘isset’ を使う: return isset this->{someProperty};
Zephirでの ‘isset’ はPHPの関数の array_key_exists に似た動作をし、Zephirでの ‘isset’ はもし配列のインデックスあるいはプロパティがnullの場合でもtrueを返します。 Fetch¶‘Fetch’ はPHPでの一般的なオペレーションを1つの指示に減らす演算子です:
if (isset($myArray[$key])) {
$value = $myArray[$key];
echo $value;
}
Zephir では、同じコードを以下のように書くことができます: if fetch value, myArray[key] {
echo value;
}
‘Fetch’ はもし ‘key’ が配列内で有効な項目で、‘value’ がある場合にのみ、trueを返します。 Typeof¶この演算子は変数の型をチェックします。‘Typeof’ は比較演算子のように動作するかも知れません: if (typeof str == "string") { // or !=
echo str;
}
また、typeof は PHP関数の ‘gettype’ のように動作することができます。 return typeof str;
注意、もしオブジェクトが ‘callable’ であることを調べたい場合、比較演算子として常に ‘typeof’ を使わなければならないことに注意してください。 型ヒント¶Zephirは常にオブジェクトから推測された変数に呼び出し/アクセスされるメソッドおよびプロパティを実装しているかどうかをチェックしようとします。 let o = new MyObject();
// Zephirは "myMethod" がMyObjectで実装されているかをチェックします
o->myMethod();
しかし、PHPから継承した動的さのために、時にはオブジェクトのクラスを知ることが簡単では無いため、Zephirは効率的にエラーの報告を生成できません。型ヒントは、コンパイラがより多くのコンパイルチェックを実施することができ、どのクラスが動的な変数に関連するかを伝えます。 // コンパイラに "o" が
// クラス MyClassのインスタンスであることを伝えます
let o = <MyClass> this->_myObject;
o->myMethod();
これらの “type hints” は弱いです。このことは、クラスが実際は指定されたクラスのインスタンスであるか、あるいは指定されたインタフェースを実装するかどうかをプログラムがチェックすることができないことを意味します。実行時に毎回これをチェックしたい場合: // プロパティがインスタンスであるかどうかを常にチェックします
// 割り当て前のMyClass
let o = <MyClass!> this->_myObject;
o->myMethod();
分岐予測ヒント¶分岐予測とは何か?この文章を調べるか、Wikipedia 文章を参照してください。パフォーマンスが非常に重要な環境では、これらのヒントを導入することが有用かも知れません。 次の例を考えます: let allPaths = [];
for path in this->_paths {
if path->isAllowed() == false {
throw new App\Exception("Some error message here");
} else {
let allPaths[] = path;
}
}
上のコードの作者は、前もって例外が投げられる条件が起こりえないだろうことを知っています。TThis means that 99.9% of the time, our method executes that condition, but it is probably never evaluated as true. プロセッサにとってこれは知ることが難しく、そこでヒントを導入することができます: let allPaths = [];
for path in this->_paths {
if unlikely path->isAllowed() == false {
throw new App\Exception("Some error message here");
} else {
let allPaths[] = path;
}
}
|