El AdvPL permite declarar y crear 4 clases de variables, que se diferencian de acuerdo con su visibilidad y tiempo de vida dentro de la aplicación. Las clases de variables son:
- Locales
- Estáticas
- Privadas
- Públicas
Variables Locales
Las variables locales deben ser declaradas explícitamente por el comando LOCAL. Las variables de dicha clase son visibles sólo para la función donde están declaradas y se descartan después de finalizar la ejecución.
Por ejemplo, si declaramos variables locales en una función denominada Teste1(), éstas pueden ser utilizadas solamente por esta función, pues son visibles sólo para ella y se descartan cuando se finaliza dicha función.
FUNCTION Teste1() LOCAL nNum := 12.97 LOCAL cNome := "LAERCIO" LOCAL aMatriz := { 5, 5 } // Instrucciones Teste2() RETURN .T.
En este ejemplo se declararon 3 variables locales: una numérica, un carácter y un array. Estas variables son visibles sólo para la función Teste1(). Cuando se ejecute la función Teste2(), llamada por la función Teste1(), las variables nNum, cNome y aMatriz existirán aún, pero serán inaccesibles o invisibles para ésta. Cuando la ejecución de la función Teste2() se finalice y se regrese a la función Teste1(), las variables se pueden utilizar nuevamente. Aún así, una vez que se finalice la ejecución de la función Teste1() se descartarán dichas variables.
Por otro lado, si existieran variables con los mismos nombres en la rutina que llamó a la función Teste1(), nada les pasará. Es decir, las variables de la función principal que llamó a la función Teste 1 continuarán activas y con el mismo valor original.
Las variables locales se crean automáticamente cada vez que se ejecutan las rutinas en las que éstas se declararon. Ellas existirán y mantendrán los datos que almacenan hasta que dichas rutinas se finalicen. Además, si la rutina se llama de forma recursiva, cada ejecución de la misma creará un nuevo conjunto de variables locales. Solamente el conjunto de variables locales más reciente será visible para la rutina.
Variables Estáticas
Las variables estáticas funcionan de manera similar a las variables locales. Sin embargo, al contrario de las locales, las estáticas se mantienen después de finalizar la ejecución de la función que las declaró. Además, se pueden iniciar en el momento de la declaración. Para declarar una variable de la clase estática, se utiliza el comando STATIC.
El alcance de las variables estáticas está limitada a la función en las que fueron declaradas. Si se declararon dentro de una función, su alcance queda limitado a dicha función. Si se declaran fuera de la función, su objetivo se aplicará a todo el programa (archivo .PRW).
Por ejemplo, si las variables estáticas se declaran en una función denominada Teste3(), éstas serán visibles sólo para esta función. Sin embargo, éstas no se descartarán al término de la función Teste3(), como ocurre con las variables locales.
FUNCTION Teste3() STATIC nNum := 1000 // Instrucciones Teste4() RETURN .T.
En este ejemplo, la variable nNum se declara como estática e se inicia con el valor numérico 1000. Cuando la función Teste4() se ejecute,llamada por la función Teste3(), la variable nNum continuará existiendo, pero no será visible para ésta. Pero, al contrario de lo que ocurre con las variables locales, la variable nNum continuará existiendo incluso después de finalizar la ejecución de la función Teste3(). Sólo pueden acceder nuevamente a la variable, las ejecuciones subsecuentes de la función Teste3().
Las variables estáticas se crean automáticamente, durante la compilación, antes de ejecutar el programa. Éstas continúan existiendo y almacenando sus valores durante toda la ejecución del programa, y no se descartan.
Un valor inicial se puede atribuir a las variables estáticas por medio del propio comando STATIC. En caso contrario, se iniciarán automáticamente con el valor NIL (ausencia de datos).
Variables Privadas
Al contrario de las variables locales y estáticas, no es necesario que las variables privadas sean declaradas explícitamente. Con todo, las variables privadas pueden ser creadas por el comando PRIVATE.
En caso que se atribuya un valor a una variable inexistente, es decir, no declarada, ésta se considerará automáticamente como una variable privada.
Cuando el comando PRIVATE crea una variable privada y se inicia sin valor, el AdvPL le atribuye automáticamente el valor NIL (ausencia de datos).
Una variable privada es visible para la rutina que la creó y para todas las rutinas llamadas por ella. Una vez creada, la variable privada continúa existiendo y mantiene su valor hasta que la rutina que la creó finalice, después de esto se descartará automáticamente.
Una variable privada se puede crear con el mismo nombre de otra variable pública o privada que ya existe, pero sólo si eso ocurre en una rutina de menor nivel que la rutina que creó la primera variable homónima. En este caso, la variable pública o privada de la rutina de mayor nivel quedará oculta y sin acceso hasta que se descarte la nueva variable privada.
Por lo tanto, una variable privada es visible para la rutina que la creó y para todas las demás rutinas llamadas por ésta. Si una rutina de menor nivel, llamada por la rutina que creó la variable, crea una nueva variable privada con el mismo nombre, la primera no tendrá acceso hasta que se descarte la segunda. El siguiente ejemplo ilustra esta condición:
FUNCTION Teste5() PRIVATE nNum := 200 // Instrucciones Teste6() RETURN .T.
En este ejemplo, la variable privada nNum se crea en la función Teste5(), y se le atribuye el valor numérico 200. Cuando se ejecuta la función Teste6(), la variable nNum continúa existiendo y, al contrario de las variables locales, es accesible. Cuando se finaliza la función Teste5(), se descarta la variable privada nNum. Si existe una variable de nivel superior, que llamó a la función Teste5(), y que eventualmente también haya creado una variable privada con el mismo nombre, ésta se volverá accesible.
Variables Públicas
Las variables públicas se crean durante la ejecución de los programas por medio del comando PUBLIC. Una vez creadas, éstas pueden ser accedidas por todos los programas, existiendo y almacenando valores hasta finalizar la ejecución de la aplicación.
Las variables públicas se pueden crear en cualquier rutina. Al contrario de las variables locales y privadas, las variables públicas no se descartan al finalizar la rutina en la que se crearon, y su contenido puede ser accedido por cualquier rutina que compone la aplicación desarrollada. Con ello, se evita la necesidad de pasar parámetros entre las rutinas. Cuando se declara una variable sin iniciarla con un valor, el AdvPL le atribuye automáticamente el valor lógico falso (.F.).
El AdvPL permite crear una variable privada con el mismo nombre de una variable pública. En este caso, la variable privada oculta temporalmente la variable pública, que se vuelve inaccesible hasta que se descarte la variable privada homónima. Aún así, no es posible crear una variable pública con el mismo nombre de una variable privada que ya existe. El siguiente ejemplo ilustra la creación de una variable pública:
FUNCTION Teste7() PUBLIC nNum := 300 // Instrucciones Teste8() RETURN .T.
En este ejemplo, se crea la variable pública nNum y se inicia con el valor numérico 300 en la función Teste7(). Cuando se ejecuta la función Teste8(), la variable nNum continúa existiendo y puede ser accedida por ésta. Al finalizar la función Teste7(), la variable nNum aún continúa existiendo y su contenido puede ser accedido y modificado por cualquier rutina de la aplicación.