1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-02 17:52:45 +01:00
psalm/docs/running_psalm/issues/UnsafeInstantiation.md

1.3 KiB
Raw Blame History

UnsafeInstantiation

Emitted when an attempt is made to instantiate a class without a constructor that's final:

<?php

class A {
    public function getInstance() : self
    {
        return new static();
    }
}

Whats wrong here?

The problem comes when extending the class:

<?php

class A {
    public function getInstance() : self
    {
        return new static();
    }
}

class AChild extends A {
    public function __construct(string $some_required_param) {}
}

AChild::getInstance(); // fatal error

How to fix

You have two options you can make the constructor final:

<?php

class A {
    final public function __construct() {}

    public function getInstance() : self
    {
        return new static();
    }
}

Or you can add a @psalm-newable annotation which ensures that any constructor in a child class has the same signature as the parent constructor:

<?php

/**
 * @psalm-newable
 */
class A {
    public function getInstance() : self
    {
        return new static();
    }
}

class AChild extends A {
    public function __construct() {
        // this is fine
    }
}

class BadAChild extends A {
    public function __construct(string $s) {
        // this is reported as a violation
    }
}