Hello, internals!

Today I was looking at PSR-7 and discovered this part of code:

$body = new StringStream(json_encode(['tasks' => [
    'Code',
    'Coffee',
]]));;
$request = $baseRequest
    ->withUri($uri->withPath('/tasks/user/' . $userId))
    ->withMethod('POST')
    ->withHeader('Content-Type' => 'application/json')
    ->withBody($body);
$response = $client->send($request);

What is wrong here? Emulated immutability. All methods will create a
separate instance of request, so
$baseRequest->withUri()->withMethod()->withHeader()->withBody() will create
total 5 object instances. It's a memory overhead and time consumption for
each method call.

What I want to discuss is true immutability flag for variables and
parameters. There are a lot of languages that use "final" or "const"
keywords to prevent modification of variables. We can use this approach by
extending language syntax as following:

const $text = "Some message"; // defines an immutable variable that can not
be modified.
$text .= "foo"; // Exception: can not change the immutable variable

class Test {
    public final $value; // final keyword defines immutable property, but
it isn't initialized yet so allows only one assignment, then will be
immutable
    public function __construct(const $value) // Argument is declared as
immutable with "const" keyword, can not be changed in the function body
    {
        $this->value = $value;
        // $value = 456; // will throw an exception
    }
}

$obj = new Test(42);
echo $obj->value; // Direct access to the property, result is 42

$obj->value = 100; // Exception: can not change the immutable (final)
property

Immutable variable can not be made mutable, but it can be assigned to the
separate mutable variable (copy on write). Example:

const $text  = "Some message";
$anotherText = $text;
$anotherText .= "modified"

On the engine level this immutable variables and parameters can be
effectively optimized by using IS_TYPE_IMMUTABLE for zval. This can result
in achieving better performance and various JIT-optimizations.

Thoughts?

Reply via email to