型态用于四种地方:

  宣告全域变数的型态.
  宣告函式的型态.
  宣告函式参数的型态.
  宣告函式里面的区域变数型态 

普通情况下, 可以完全忽略型态的资料, 把它当作是程式的说明. 例外的情况是驱
动程式对程式最佳化 (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)  使目前的函式能呼叫它们.

函式原型的例子: 
 
  string func(int arg);

注意, ;  (分号) 代替了函式的内容. 所有的参数可以指定名称, 却不见得要跟实
际的函式参数同名. 也可以不写参数的名字:

  string func(int);
 
型态有两种分类: 基本型态和特殊型态. 一个变数或函式最多只能指定一种基本型
态, 却可以指定许多特殊型态.

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

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

基本型态分为两组. 分别为存取变数值 (value)  及存取位址 (address). int,
string, float 属于存取变数值的型态. 而 mapping, function, object, pointer
(前面有 * 号的型态) 属于位址. 如果把位址型态的值指定给一个变数, 或当作参
数, 它们会指向真正的资料所在. 也就是说, 如果改变一个阵列的元素值, 则所有
指向此阵列的变数指标也会一起改变. 但是要改变一个阵列的大小, 一定要重新配
置 (allocate) 一个新的阵列. 比较运算子 (comparison operator)“==”对于前
述的存取变数值一组的型态, 会比较其真正的值. 但是对于 array, mapping 等等
, 只会检查两者是否是相同的阵列、映射等等. 在此有一个很重要的提示是, 运算
式: ({ 1 }) == ({ 1 })  会产生伪值 (false), 因为使用 ({ ... })  这一对阵
列构造运算子 (array construction operator-pair) , 会产生新的阵列.
 
基本型态
 
int (整数)
  整数 (32 bit).
 
float (浮点数)
  浮点数 (32 bit).
 
string (字串)
  无限 (unlimited)  的字元字串 (没有“\0”).
 
object (物件)
  一个物件指标.
 
mapping (映射)
  一种联结 (associative)  阵列的形式; 请参考其他文件.
 
function (函式指标)
  一种特殊的型态, 以某种方式指向一个函式; 请参考其他文件.
 
Arrays (阵列)
  在一个基本型态前面加上 *  号以宣告阵列. 譬如说, 宣告一个整数阵列:
  int *arr; . 如果您想宣告一个阵列的阵列 (译按: 即二元阵列) , 要使用
  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.
