Late Static Binding
Late Static Binding is a PHP feature that allows referening the type that was used within the call of the current static method. In the example below, a program can reference to A or B using the single keyword static.
<?php
class A {
static function make() { return new static; } }
}
class B extends A {}
A::make(); // => new A
B::make(); // => new B
Compiler#
The compiler analyses the content of every function. When the static keyword is used within a function, it generates an additional (hidden, synthesized, compiler-generated, implicit) parameter PhpTypeInfo <static>.
In the example above, the .NET signature of method make() would be
public static void make(Context <ctx>, PhpTypeInfo <static>)
Occurrences of static within the function are translated to a specific use of the <static> parameter. In the example above, the PHP code new static is lowered to the C# equivalent <ctx>.Create(<static>).
Use from C# (or another .NET language)#
Since functions using late static binding have additional generated parameters, it has to be taken into account when invoking them. The parameters must not be ignored; passing a null value would cause an exception. The runtime library (Peachpie.Runtime) provides helper methods for creating PhpTypeInfo from a type. Use the PhpTypeInfoExtension helper class in order to obtain an instance of PhpTypeInfo to be passed into a generated <static> parameter, like in the following example:
B.make(ctx, PhpTypeInfoExtension.GetPhpTypeInfo<B>()); // ctx is an instance of Context representing current execution context