La clase VARIANT

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

Descripción

La clase VARIANT es un equivalente de COM para el PHP zval; es una estructura que puede contener un valor con un rango de diferentes tipos posibles. La clase VARIANT suministrada por la extensión COM, permite tener un mayor control sobre el modo en que PHP pasa los valores hacia y desde COM.

$vVar = new VARIANT($var)

Métodos

VARIANT::VARIANT(mixed $value = ?, int $type = ?, int $codepage = ?)

constructor de clase VARIANT. Parámetros:

value
valor inicial. si se omite, o se le da valor null se creará un objeto vacío VT_EMPTY.
type
especifica el tipo de objeto VARIANT contenido. Los valores posibles son una de las constantes VT_XXX Constantes predefinidas. En versiones PHP anteriores a PHP 5, se puede forzar a PHP para que pase un objeto VARIANT por referencia, combinando VT_BYREF con el operador OR y el parámetro type. En PHP 5, este hack no está soportado; en lugar de eso, PHP 5 puede detectar los parámetros pasados por referencia automáticamente; ni siquiera es necesario pasarlos como objetos VARIANT. Consultar la biblioteca MSDN para información adicional sobre el tipo VARIANT.
codepage
especifica la página de códigos que se utilizará para convertir los strings a unicode. Ver el parámetro del mismo nombre en la clase COM para más información.

Las versiones PHP anteriores a PHP 5 definen un número de propiedades virtuales (no documentadas) para las instancias de la clase VARIANT; estas propiedades han sido eliminadas en PHP 5 en favor de una sintaxis más natural; estas diferencias se ilustran mejor con el siguiente ejemplo:

Ejemplo #1 Ejemplo de una clase VARIANT, utilizada en PHP 4.x

<?php
$v 
= new VARIANT(42);
print 
"El tipo es " $v->type "<br/>";
print 
"El valor es " $v->value "<br/>";
?>

Ejemplo #2 Ejemplo de una clase VARIANT, utilizada en PHP 5

<?php
$v 
= new VARIANT(42);
print 
"El tipo es " variant_get_type($v) . "<br/>";
print 
"El valor es " $v "<br/>";
?>

La razón para este cambio es que, internamente, la extensión COM ve a las clases VARIANT, COM y DOTNET como la misma cosa, y la filosofía de diseño para estas clases es que todos los accesos a las propiedades y los miembros se transmiten a través de COM sin ninguna interferencia. La nueva sintaxis es más natural y requiere menos esfuerzo, y muchas de las propiedades virtuales eliminadas ya no tienen sentido en un contexto PHP.

Nota:

PHP 5 toma una aproximación mucho más simple en la gestión de VARIANTs; cuando se devuelve un valor o se carga una propiedad VARIANT, ésta se convierte en un valor PHP únicamente cuando hay un mapeo directo entre los tipos de tal forma que no se pierda información. En todos los otros casos, el resultado es devuelto como una instancia de la clase VARIANT. Se puede forzar a PHP para convertir o evaluar la clase VARIANT como un tipo nativo PHP utilizando un operador para clasificarla explícitamente, o implícitamente como un string con la función print. Es posible utilizar el amplio rango de funciones VARIANT para realizar operaciones aritméticas en VARIANTS sin forzar una conversión o arriesgarse a una pérdida de información.

Ver también la función variant_get_type().

add a note add a note

User Contributed Notes 2 notes

up
19
darren at dcook dot org
16 years ago
If you are frustrated that print_r($obj) (where $obj is something returned from a call to a function on a COM object) does not return anything helpful, and that variant_get_type($obj) just returns a number, the function you are actually after is:
  com_print_typeinfo($obj);

It lists all functions, variables, their types in a human-readable (well, programmer-readable) format. Lovely!
up
3
richard dot quadling at carval dot co dot uk
21 years ago
With thanks to Harald Radi and Wez Furlong.

Some VBA functions have optional parameters. Sometimes the parameters you want to pass are not consecutive.

e.g.

GoTo What:=wdGoToBookmark, Name="BookMarkName"
GoTo(wdGoToBookmark,,,"BookMarkName)

In PHP, the "blank" parameters need to be empty.

Which is ...

<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);

// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);

// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();

// Load the appropriate type library.
com_load_typelib('Word.Application');

// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print
"Loaded Word, version {$word->Version}\n";

// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');

// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print
"Word closed.\n";
?>

The example document is ...

Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.

and it would be called ...

word.php?YourName=Richard%20Quadling&YourAge=35

Regards,

Richard.
To Top