SunshinePHP Developer Conference 2015

La classe VARIANT

(PHP 4 >= 4.1.0, PHP 5)

Description

Le VARIANT est un équivalent de COM pour PHP zval ; c'est une structure qui peut contenir une valeur avec un intervalle de types possibles. La classe VARIANT fournie par l'extension COM vous permet d'avoir plus de contrôle sur ce que PHP envoie et reçoit de COM.

$vVar = new VARIANT($var)

Methods

VARIANT::VARIANT ([ mixed $value [, int $type [, int $codepage ]]] )

Constructeur VARIANT. Paramètres :

value
valeur initiale. Si omis, un objet VT_EMPTY sera créé.
type
spécifie le type d'objet VARIANT contenu. Les valeurs possibles sont une des constantes VT_XXX Constantes pré-définies. Dans les versions antérieures à PHP 5, vous pouvez forcer PHP à passer un objet VARIANT par référence en combinant VT_BYREF avec l'opérateur OR et le paramètre type. En PHP 5, ce hack n'est pas supporté ; en lieu et place, PHP 5 peut détecter les paramètres passés par référence automatiquement ; ils n'ont pas à être passés comme des objets VARIANT. Consultez la bibliothèque MSDN pour plus de détails.
codepage
spécifie le code qui est utilisé pour transformer les chaînes de caractères PHP en chaînes unicode, et vice-versa. Voir le paramètre du même nom dans la COM classe pour plus d'informations.

Les versions antérieures à PHP 5 définissent un nombre de propriétés virtuelles (non-documenté) pour les instances de classe VARIANT ; ces propriétés ont toutes été supprimées de PHP 5 en faveur d'une syntaxe plus naturelle ; ces différences sont bien illustrées par cet exemple :

Exemple #1 Exemple d'une classe VARIANT, comme utilisé en PHP 4.x

<?php
$v 
= new VARIANT(42);
print 
"The type is " $v->type "<br/>";
print 
"The value is " $v->value "<br/>";
?>

Exemple #2 Exemple d'une classe VARIANT, comme utilisé en PHP 5

<?php
$v 
= new VARIANT(42);
print 
"The type is " variant_get_type($v) . "<br/>";
print 
"The value is " $v "<br/>";
?>

Les raisons de ces changements sont que, en interne, l'extension COM voit les classes VARIANT, CM et DOTNET comme étant la même chose, et l'esprit pour ces classes est que tous les accès aux propriétés et aux méthodes sont transmis à COM sans interférence. La nouvelle syntaxe est plus naturelle et demande moins d'efforts et la plupart des propriétés virtuelles supprimées n'ont plus aucun sens dans ce contexte.

Note:

PHP 5 prend une approche plus simple pour gérer les classes VARIANT ; lorsqu'il retourne une valeur d'une propriété VARIANT, elle est convertie en une valeur PHP seulement s'il y a un mappage direct entre les types sans perdre aucune information. Dans tous les autres cas, le résultat est retourné comme une instance de la classe VARIANT. Vous pouvez forcer PHP à convertir ou à évaluer la classe VARIANT comme un type natif de PHP en utilisant explicitement un opérateur de transtypage, ou implicitement transtyper en une chaîne pour l'afficher en utilisant par exemple l'instruction print. Vous pouvez utiliser l'éventail de fonctions pour réaliser des opérations arithmétiques sur les classes VARIANT sans forcer des conversions ou bien risquer de perdre des données.

Voir aussi la fonction variant_get_type().

add a note add a note

User Contributed Notes 4 notes

up
4
darren at dcook dot org
7 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
0
richard dot quadling at carval dot co dot uk
11 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.
up
0
alain at samoun dot com
13 years ago
<?php
# I think that we need some examples of this thing:
# Lets define a real variant:
$varREAL=  new Variant("9.34 is a real number",VT_R8);
print
"Value:". $varREAL->value; # Will print 9.34
# Now an integer
 
$varINT=  new Variant("9.34 Printed as an integer",VT_INT);
print
"Value:". $varINT->value; # Will print 9
# Now a string
 
$varSTR=  new Variant("9.34 Printed as a string",VT_BSTR);
print
"Value:". $varSTR->value; # Will 9.34 Printed as a string
    
?>
up
-1
mark dot pearson at capita dot co dot uk
10 years ago
Running PHP 4.3.2 on Windows 2000 I had to use the following expression to create an empty Variant:

<?php
$empty
= new Variant(null);
print
$empty->type //     ==>   1
?>

NOT

<?php
$empty
= new Variant();
print
$empty->type //     ==>   0
?>

The two expressions return different Variant type values!
To Top