general


类型用于四种地方:

普通情况下, 可以完全忽略类型的数据, 把它当作是程序的说明. 例外的情况是驱动程序对程序最佳化 (optimization) 时, 如果声明 x  为 int (整数) 变量, 则将 x + 0  视为与 x  相同. 但是 x  声明为 string (字符串)  变量时, 结果就不可能与前面一样. 当一个函数的基本类型已经声明时, 会在函数内部强迫加上一个较严格的类型检查 (strict type checking) . #pragma strict_types  强迫函数必须有返回值 (return value),  所以无法避免函数内部的严格类型检查. 这样表示, 一定要定义所有参数的类型, 而变量只能储存其声明类型的值. call_other() 函数定义为返回 unknown (未知) 类型值, 因为驱动程序不可能知道返回值得类型. 如果定义了 CAST_CALL_OTHERS,  就必须指定返回值, 结果就假设其类型为mixed  (混合) . 指定 (cast) 返回值类型, 可以将类型名称放在 ( ) (小括号) 里面. 这样子指定类型没有什么实际效果, 只是安慰编译器而已.

范例如下, 查询一个物件的简称:

当一个函数以严格类型检查时, 只能调用其他已经定义的函数. 如果函数尚未定义, 就必须事先用函数原型 (prototype)  使目前的函数能调用它们.

函数原型的例子:

注意, ;  (分号) 代替了函数的内容. 所有的参数可以指定名称, 却不见得要跟实际的函数参数同名. 也可以不写参数的名字: 类型有两种分类: 基本类型和特殊类型. 一个变量或函数最多只能指定一种基本类型, 却可以指定许多特殊类型.

只有编译器用得到严格类型检查, 执行时段 (runtime)  则不用. 所以实际上, 就算使用严格类型检查, 也可以在一个字符串变量里, 放上一个数字.

为什么要使用严格类型检查 ?  我们还是建议您用它, 因为编译器会在编译程序时找出错误而省下许多除错的时间. 通常在执行时段中追踪一个错误是很困难的.

基本类型分为两组. 分别为存取变量值 (value)  及存取位址 (address). int, string, float 属于存取变量值的类型. 而 mapping, function, object, pointer (前面有 * 号的类型) 属于位址. 如果把位址类型的值指定给一个变量, 或当作参数, 它们会指向真正的数据所在. 也就是说, 如果改变一个数组的元素值, 则所有指向此数组的变量指针也会一起改变. 但是要改变一个数组的大小, 一定要重新配置 (allocate) 一个新的数组. 比较运算符 (comparison operator)「==」对于前述的存取变量值一组的类型, 会比较其真正的值. 但是对于 array, mapping 等等, 只会检查两者是否是相同的数组、映射等等. 在此有一个很重要的提示是, 运算式: ({ 1 }) == ({ 1 })  会产生伪值 (false), 因为使用 ({ ... })  这一对数组构造运算符 (array construction operator-pair) , 会产生新的数组.


基本类型


int (整数) float (浮点数) string (字符串) object (物件) mapping (映射) function (函数指针) Arrays (数组) void (无返回值) mixed (混合)
特殊类型

有一些特殊类型, 可以加在基本类型之前. 这些特殊类型可以互相组合. 在一个继承语句 (inherit statement)  之前指定某个特殊类型, 则继承而来的类型也会与这个特殊类型合并. 唯一的例外是 public  (公共) 类型, 不可以再以 private 继承语句定义为 private 类型.
 
varargs (不定参数)

private (私有) static (静态) public (公共) nomask (不可遮盖)
翻译: Spock @ FF 97.Aug.11.

回到上一页