注意 | 此命令在 Core 和 Vulcan 方言中不可用。 |
用途
创建应用程序中所有例程都能看到的变量和数组。
PUBLIC <memVarList>
PUBLIC <idVar> [:= <uValue>] | <ArraySpec> [, ...]
PUBLIC <idVar> [:= <uValue>] [AS <Type> [OF <ClassLibrary>] ] // 仅用于 FoxPro 方言
PUBLIC ARRAY <arrayName> ( <nRows> [, <nColumns>] ) [, <arrayName> ( <nRows> [, <nColumns>] ) ] // 仅用于 FoxPro 方言
PUBLIC ARRAY <arrayName> [ <nRows> [, <nColumns>] ] [, <arrayName> [ <nRows> [, <nColumns>] ] ] // 仅用于 FoxPro 方言
<memVarList> | 一个或多个变量名,用逗号分隔。 |
<idVar> | 要创建的公有变量的有效标识符名称。 |
idVar 可以加上一个“&”前缀(例如PUBLIC &name)。在这种情况下,编译器会认为 idVar 应包含一个已声明和初始化的变量名称字符串。 |
<uValue> | 为变量赋值的初始值。 可以是任何有效的表达式。 如果没有指定 <uValue>,变量将被初始化为 FALSE。但也有例外: |
在 FoxPro 方言中,PUBLIC FOX 和 FOXPRO 初始化为 TRUE。 |
在其他方言中,PUBLIC CLIPPER 初始化为 TRUE。 |
<ArraySpec> | 要创建的动态数组的规格。 <ArraySpec> 是以下内容之一: |
<idArray>[<nElements>, <nElements>, <nElements>] |
<idArray>[<nElements>][<nElements>][<nElements>] |
除第一个 nElements 外,其他均为可选。 |
<idArray> 是要创建的数组的有效标识符名称。 数组元素初始化为 NIL。 |
<nElements> 定义数组特定维数的元素个数。 维数由指定 <nElements> 参数的个数决定。 |
<Type> & <ClassLibrary> | 编译器可以识别 FoxPro 方言中的 AS <Type> 和 AS <Type> of <Classlibrary> 子句。 |
<Type> 和 <ClassLibrary> 子句被忽略,因为动态内存变量的类型始终是 USUAL |
<arrayName> | 数组的变量名。数组的大小与 <nRows> 和 <nColumns> 所声明的一样。数组可以使用小括号作为分隔符,也可以使用方括号。 |
<nColumns> 是可选项 |
我们建议使用方括号。 |
PUBLIC 是一条可执行语句,这意味着您必须在定义例程中的任何变量声明语句(即 FIELD、LOCAL 和 MEMVAR)之后指定它。
警告 除非未声明变量(Undeclared Variables)编译器选项被选中,否则使用此语句创建的任何变量引用都会产生编译器错误。
任何与现有公有或私有变量同名的声明变量(如 LOCALs)都会暂时隐藏公有或私有变量,直到覆盖变量被释放或不再可见。
如果试图创建一个与现有可见的私有变量同名的公有变量,则会被直接忽略;但 PUBLIC 语句的赋值部分不会被忽略。 例如,下面几行代码改变了变量 x 的值,但并没有将其作用域从私有变为公有:
PRIVATE x := 1000
...
PUBLIC x := "New value for x"
? x // 结果: "New value for x"
对这种行为的解释是,在内部,PUBLIC 语句和赋值被视为不同的语句。 因此,这段代码将被处理如下:
PRIVATE x := 1000
...
PUBLIC x
x := "New value for x"
? x // 结果: "New value for x"
PUBLIC 语句会被忽略,但赋值语句会被执行,从而改变私有变量 x 的值。
当你使用一个已经存在的私有变量名声明一个公有数组时,这种行为会产生一个有趣的影响。 例如
PRIVATE x := 1000
...
PUBLIC x[10]
? x[1] // 结果: NIL
在这种情况下,PUBLIC 语句也被视为两个单独的语句:
PRIVATE x := 1000
...
PUBLIC x
x := ArrayNew(10)
? x[1] // 结果: NIL
同样,PUBLIC 语句被忽略,赋值将 x 从一个私有数值变量变为对 10 个元素数组的私有引用。
如果试图指定一个与可见的已声明变量(例如 LOCAL、GLOBAL 或 DEFINE)冲突的公有变量,编译器不会将其视为错误,因为 PUBLIC 并不是编译器声明语句。 相反,声明的变量会在运行时隐藏公有变量。 这意味着,在声明的变量被释放之前,你根本无法访问公有变量。
在类方法中,实例变量(ACCESS/ASSIGN变量除外)总是比同名的公有变量更可见。 如果存在名称冲突,请使用 _MEMVAR-> 别名访问方法中的公有变量。 对于ACCESS/ASSIGN变量,使用 SELF: 前缀来覆盖与公有变量名称冲突的情况。
公有变量是动态作用域。 它们在程序运行期间或使用 CLEAR ALL 或 CLEAR MEMORY 明确释放之前一直存在。
PUBLIC Clipper: 为了在应用程序中包含 XSharp 扩展名,并允许应用程序在 dBASE III PLUS 下运行,在使用 PUBLIC 创建时,特殊公有变量 Clipper 初始化为 TRUE。
本例创建了两个 PUBLIC 数组和一个 PUBLIC 变量:
PUBLIC aArray1[10, 10], var2
PUBLIC aArray2[20][10]
以下 PUBLIC 语句创建变量并初始化变量值:
PUBLIC cString := Space(10), cColor := SetColor()
PUBLIC aArray := {1, 2, 3}, ;
aArray2 := ArrayNew(12, 24)
GLOBAL, MEMVAR, PARAMETERS, PRIVATE, DIMENSION, DECLARE