• 特殊运算符
    • Empty
    • Fetch
    • Isset
    • Typeof

    特殊运算符

    支持一下操作符

    Empty

    这个运算符允许检查表达式是否为空。 ‘Empty’表示表达式为null,可以是空字符串或空数组:

    1. let someVar = "";
    2. if empty someVar {
    3. echo "is empty!";
    4. }
    5. let someVar = "hello";
    6. if !empty someVar {
    7. echo "is not empty!";
    8. }

    Fetch

    Fetch操作符将PHP中的一个常见操作简化为一条指令:

    1. <?php
    2. if (isset($myArray[$key])) {
    3. $value = $myArray[$key];
    4. echo $value;
    5. }

    在Zephir中,您可以编写与以下代码相同的代码:

    1. if fetch value, myArray[key] {
    2. echo value;
    3. }

    ‘Fetch’只返回true,只有在’key’是数组中的有效项的情况下进行’value’填充。

    Isset

    这个操作符检查是否在数组或对象中定义了属性或索引:

    1. let someArray = ["a": 1, "b": 2, "c": 3];
    2. if isset someArray["b"] { // check if the array has an index "b"
    3. echo "yes, it has an index 'b'\n";
    4. }

    使用isset作为返回表达式:

    1. return isset this->{someProperty};

    注意,在Zephir中isset </code>更像PHP的函数array_key_exists,在Zephir中`isset</0>即使数组索引或属性为空也返回true。</p>

    Typeof

    这个操作符检查变量的类型。 'typeof'可与比较运算符一起使用:

    1. if (typeof str == "string") { // or !=
    2. echo str;
    3. }
    4. `</pre>
    5. 它也可以像PHP函数`gettype`那样工作。
    6. ```zephir
    7. return typeof str;
    8. ```
    9. **坑: **,如果你想检查一个对象是否“callable”,你总是必须使用`typeof`作为比较运算符,而不是函数。
    10. ### 类型提示
    11. Zephir总是试图检查一个对象是否实现了方法和属性,这些方法和属性在一个被推断为对象的变量上被调用/访问:
    12. ```zephir
    13. let o = new MyObject();
    14. // Zephir checks if "myMethod" is implemented on MyObject
    15. o->myMethod();
    16. ```
    17. 但是,由于继承自PHP的动态性,有时很难知道对象的类,所以Zephir无法有效地生成错误报告。 类型提示告诉编译器哪个类与动态变量相关,允许编译器执行更多的编译检查:
    18. ```zephir
    19. // Tell the compiler that "o"
    20. // is an instance of class MyClass
    21. let o = this->_myObject;
    22. o->myMethod();
    23. ```
    24. 这些 "类型提示" 很弱。 这意味着程序不检查该值是否实际上是指定类的实例, 也不检查它是否实现了指定的接口。 如果希望它每次执行时都检查此问题, 请使用严格的类型:
    25. ```zephir
    26. // 始终检查属性是否为实例
    27. // 在使用前检查
    28. let o = <MyClass!> this->_myObject;
    29. o->myMethod();
    30. ```
    31. ### 分支预测提示
    32. 什么是分支预测? 请检查此 [article](http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/) 或参考 "1>Wikipedia 文章 </1 >。 在性能非常重要的环境中, 引入这些提示可能会很有用。
    33. 请考虑下面的示例:
    34. ```zephir
    35. let allPaths = [];
    36. for path in this->_paths {
    37. if path->isAllowed() == false {
    38. throw new App\Exception("Some error message here");
    39. } else {
    40. let allPaths[] = path;
    41. }
    42. }
    43. ```
    44. 上述代码的作者事先知道, 引发异常的条件不太可能发生。 这意味着, 99.9% 的时间, 我们的方法执行该条件, 但它可能永远不会被评估为 true。 对于处理器, 这可能很难知道, 因此我们可以在那里引入一个提示:
    45. ```zephir
    46. let allPaths = [];
    47. for path in this->_paths {
    48. if unlikely path->isAllowed() == false {
    49. throw new App\Exception("Some error message here");
    50. } else {
    51. let allPaths[] = path;
    52. }
    53. }
    54. ```