Skip to content


assembly: Peachpie.Runtime.dll

PHP is a loosely typed language. It specifies the value of a variable not to be restricted to a single type. This is referred to as type ambiguity, type dynamicity, or is also known as mixed.

PeachPie defines struct PhpValue as the abstraction of PHP's mixed. This .NET type is used in case a type of value cannot be resolved in compile time. It applies to global variables in general, function parameters without a type hint, function return types without a type hint, class properties, and local variables.


To PhpValue#

Any .NET type can be converted to PhpValue. The following table lists the types and the corresponding conversion function.

.NET type Conversion routine Sample
bool implicit cast (PhpValue)true
int implicit cast (PhpValue)(-1)
long implicit cast (PhpValue)9876543210L
double implicit cast (PhpValue)123.456
string implicit cast (PhpValue)"Hello"
byte[] implicit cast (PhpValue)Encoding.UTF8.GetBytes("Hello")
PhpArray implicit cast (PhpValue)new PhpArray()
PhpArray represents PHP's array object.
delegate implicit cast (PhpValue)new Func<int>(() => 123)
In PHP, the delegate is treated as an instance of a callable class.
object FromClass() PhpValue.FromClass(new System.Object())

From PhpValue#

A value can be converted to a standard .NET type using the following conversion routines. When applicable, the conversion respects the PHP semantic of the casting values.

.NET type Conversion routine Sample Remarks
bool implicit cast (bool)value -
ushort explicit cast (ushort)value OverflowException, PHP notice
int explicit cast (int)value OverflowException, PHP notice
uint explicit cast (uint)value OverflowException, PHP notice
long explicit cast (long)value PHP notice
double explicit cast (double)value PHP notice
string explicit cast value.ToString() byte[] is encoded using UTF-8
PhpNumber explicit cast (PhpNumber)value InvalidCastException
PhpArray explicit cast (PhpArray)value conversion to array according to PHP semantic
PhpAlias EnsureAlias() value.EnsureAlias() -
Object AsObject() value.AsObject() gets underlaying class instance, can be null.
Object ToClr() #c# value.ToClr() boxes any underlaying value into System.Object, can be null.
T Cast() #c# value.Cast<MyClass>() performs appropriate conversion of underlaying value into CLR type T.


The type defines arithmetic and comparison operators according to PHP semantics.

Operator Sample Remarks
== val1 == val2 non-string equality
!= val1 != val2 non-strict inequality
< val1 < val2 comparison
~ ~val1 bit negation
& val1 & val2 bit and
| val1 | val2 bit or
^ val1 ^ val2 bit xor
/ val1 / val2 division, operands are converted to number
* val1 * val2 multiplication, operands are converted to number
[] val[1] accessing value item as array according to PHP semantic
StrictEquals val1.StrictEquals(val2) strict equality, PHP' ===
ToArray val.ToArray() conversion to array according to PHP semantic
AsArray val.AsArray() gets underlaying PhpArray or null
AsCallable val.AsCallable() gets IPhpCallable from PHP' callable which can be invoked, can be null

Visitor pattern#

PhpValue type implements a visitor pattern so you can traverse through the underlying value structure. It is useful in the case of arrays or objects. It is also used for implementing serializers.

Method: PhpValue.Accept( PhpVariableVisitor visitor)


class MyVisitor : PhpVariableVisitor {
    public override void AcceptNull() { } // PhpValue contains NULL!
value.Accept( new MyVisitor() ); // traverses through the value, arrays and objects

Note, the visitor implementation does not check for cycles in the underlying structure. Infinite recursion may occur when the underlying object or array contains a referenced value to itself.