Работа с типами

О том, как работать с разными типами данных в .NET из PHP

У продвинутого пользователя может возникнуть вопрос о том, как работает синхронизация типов между PHP и .NET. Довольно интересный вопрос, учитывая, что PHP - язык динамически типизированный, а .NET - статически

На самом деле всё довольно таки просто. При обращении к VoidCore все типы данных автоматически приводятся к нужному типу. Работает это по следующей схеме:

При обращении к методам .NET VoidCore приводит все параметры к контекстным значениям. К примеру, Вы пытаетесь вызвать метод MessageBox.Show (string message, string caption). В таком случае VoidCore видит, что вы ввели два аргумента (VoidCore::callMethod ($messageBox, '123', 'test')) и при этом в .NET оба эти аргумента являются строками. Ну так он возьмёт тогда и приведёт эти аргументы к строкам, а если это не получилось - ну, на этом его полномочия всё

При получении результата VoidCore, соответственно, смотрит на возвращаемый тип. К примеру, мы пытаемся получить родителя какого-то объекта Form: Form.Parent. При этом VoidCore видит, что значение этого параметра - объект. Тогда он создаст указатель (selector) на этот объект и вернёт его PHP для дальнейшей работы

Указание предпочитаемого типа

Помимо автоматического приведения типов VoidCore предоставляет возможность использовать ручное приведение типа при вызове какого-то VoidCore-метода. Для этого при передаче аргументов используйте конструкцию вида array (параметр, тип). При этом в качестве типа нужно использовать одну из представленных констант:

Константа

Описание

VC_STRING

Строка (string)

VC_INT

Число (int)

VC_BOOL

Логическая переменная (bool)

VC_OBJECT

VoidCore объект (selector)

VC_DOUBLE

Число с плавающей запятой (double)

VC_COLOR

Цвет

VC_FLOAT

Число с плавающей запятой (float)

VC_HANDLE

Handle окна (handle)

VC_CHAR

Символ (char)

VC_BYTE

Байт (byte)

VC_NULL

null

Так же возможно указать предпочитаемый тип возвращаемого значения в "методах-геттерах" и вызове метода VoidCore объекта. Для этого в названиях нужно использовать конструкцию, описанную выше

Учтите, что типы VC_FLOAT, VC_CHAR и VC_BYTE нельзя указывать в качестве предпочитаемого возвращаемого VoidCore-методом типа

К примеру:

script.php

<?php

$messageBox = VoidCore::getClass ('System.Windows.Forms.MessageBox');

VoidCore::callMethod ($messageBox, 'Show', [123, VC_STRING], [345, VC_STRING]);
script.php

<?php

$form   = VoidCore::createObject ('System.Windows.Forms.Form');
$button = VoidCore::createObject ('System.Windows.Forms.Button');

VoidCore::setProperty ($button, 'Parent', $form);

# Выведет результат, аналогичный приведению $button Parent к строке
# то есть Button.Parent.ToString ()
# или (string)(Button.Parent)
echo VoidCore::getProperty ($button, ['Parent', VC_STRING]);

VoidCore::convert

int VoidCore::convert (scalar $object, string $class) — приведение объекта к указанному типу и возвращение указателя на него

Аргумент

Описание

scalar $object

Указатель на объект или значение для приведения

string $class

Полный .NET класс типа

Пример:

script.php
<?php

$msgbox = VoidCore::getClass ('System.Windows.Forms.MessageBox');
$text   = VoidCore::convert (123, 'System.String');

# Выведет "123"
VoidCore::callMethod ($msgbox, 'Show', [$text, VC_OBJECT]);

Last updated

Was this helpful?