On Sun, 14 Mar 2021 at 12:02, Gert de Pagter <gert...@gmail.com> wrote:

> Hey Internals,
>
> Recently i've been working on an older code base, where we have a lot
> of classes with all
> static methods. We've been moving to injecting the classes, and
> calling the methods as if they
> were not static.
>
> I wanted to add interfaces to these classes, with non static methods,
> so we can pretend in our implementation they are not static, and allow
> us to easier switch to non static methods in the future.
>
> This is (currently) not allowed by the language: https://3v4l.org/WKdvM
> Is there any chance of this being possible in future versions of PHP?
> This would only allow 'normal' methods to become static. Making static
> methods non static would break Liskov substitution principle in PHP as
> you may not be able to call the method in the same way. This means you
> can't have a 'normal' method become static in an inherited class, and
> then become 'normal' again in another inherited class. This works the
> same way with co/contra-variance in return/parameter types:
> (https://3v4l.org/j1SO9)
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
>
>
It's maybe possible in the special case of implementing interfaces, but
it's unsound for general inheritance:

<?php

class A {
    public int $someInt = 0;

    public function getSomeInt() : int {
        return $this->someInt;
    }
}

class B extends A {
    public static function getSomeInt() : int {
        return parent::getSomeInt();
    }
}

https://3v4l.org/WnaES

Reply via email to