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) 返回值类型, 可以将类型名称放在
( ) (小括号) 里面. 这样子指定类型没有什么实际效果, 只是安慰编译器而已.
范例如下, 查询一个物件的简称:
(string)call_other(ob, "short");
(string)ob->short();
当一个函数以严格类型检查时, 只能调用其他已经定义的函数. 如果函数尚未定义,
就必须事先用函数原型 (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 (字符串)
无限 (unlimited) 的字符字符串 (没有「\0」).
object (物件)
mapping (映射)
一种联结 (associative) 数组的形式; 请参考其他文件.
function (函数指针)
一种特殊的类型, 以某种方式指向一个函数; 请参考其他文件.
Arrays (数组)
在一个基本类型前面加上 * 号以声明数组. 譬如说, 声明一个整数数组:
如果您想声明一个数组的数组 (译按: 即二元数组) , 要使用 mixed (混合) 类型,
或是 mixed 与其他类型的组合.
void (无返回值)
这种类型只能用于函数. 它代表函数没有任何返回值. 如果此函数有返回值
(有类型检查时) , 编译器就会抱怨.
mixed (混合)
此种类型很特殊, 这种类型可以使用任何类型的内容. 所以任何声明为 mixed
(混合) 类型的变量、函数、参数, 都不会引起编译器的抱怨. 但是混合类型的目的并不在此.
只有在一个变量真正包括不同的内容类型时, 才适于使用混合类型. 请尽量避免使用此种类型,
因为让一个函数返回不同类型的值, 是不好的程序写法.
特殊类型
有一些特殊类型, 可以加在基本类型之前. 这些特殊类型可以互相组合. 在一个继承语句
(inherit statement) 之前指定某个特殊类型, 则继承而来的类型也会与这个特殊类型合并.
唯一的例外是 public (公共) 类型, 不可以再以 private 继承语句定义为 private
类型.
varargs (不定参数)
这种类型的函数可以传入不定数目的参数. 不是此类型的函数, 则会检查参数的个数,
如果数目不符会产生错误.
private (私有)
可以用于函数和变量. 一个物件中的 private 函数, 无法经由 call_other()
被其他物件调用之. 而继承此物件的其他物件也无法使用此函数.
static (静态)
这种特殊类型让变量和函数的行为变得不太一样. 对函数来说, 其效果类似于
private, 其他物件也无法利用 call_other() 调用此函数. static 变量则无法使用
save_object() 储存, 或 restore_object() 载入其值.
public (公共)
定义为 public 类型的函数都能被其他物件调用, 甚至是继承而来的 private
函数也可以定义为 public.
nomask (不可遮盖)
任何定义为 nomask 的函数或变量, 都不能经由继承再次重新定义. 但是可以依原来的定义使用之.
nomask 也阻止函数被 shadow() 投影.
翻译: Spock @ FF 97.Aug.11.
回到上一页