目次

前のトピック

< 型

次のトピック

配列 >

このページ

演算子

Zephirの演算子のセットはPHPのそれらと似ており、それらの挙動のいくらかも継承します。

算術演算子

以下の演算子がサポートされます:

オペレーション
-a
足し算 a + b
引き算 a - b
掛け算 a * b
割り算 a / b
モジュラス a % b

比較演算子

比較演算子は比較される変数の型に依存します。例えば、もし比較される両方のオペランドが動的な変数の場合、その挙動はPHPと同じです:

a == b 等価 型のやり繰りの後で a が b に等しい場合TRUE。
a === b 同一 a が b に等しく、それらが同じ型の場合 TRUE。
a != b 等しくない 型のやり繰りの後で a が b に等しくない場合にTRUE。
a <> b 等しくない 型のやり繰りの後で a が b に等しくない場合にTRUE。
a !== b 等価では無い a が b に等しく無いか、それらが同じ型では無い場合にTRUE。
a < b より少ない a が厳密に b より少ない場合にTRUE。
a > b より多い a が厳密に bより多い場合にTRUE。
a <= b より少ないか等しい a が bより少ないか等しい場合にTRUE。
a >= b より多いか等しい a が bより多いか等しい場合にTRUE。

例:

if a == b {
    return 0;
} else {
    if a < b {
        return -1;
    } else {
        return 1;
    }
}

論理演算子

以下の演算子がサポートされます:

オペレーション
And a && b
Or a || b
否定 !a

例:

if a && b || !c {
    return -1;
}
return 1;

ビット演算子

以下の演算子がサポートされます:

オペレーション
And a & b
Or (包括的な和) a | b
Xor (排他的論理和) a ^ b
否定 ~a
左シフト a << b
右シフト a >> b

例:

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;
    }
}
TOP
inserted by FC2 system