php oop - 强制静态方法' s param成为当前类的对象

时间:2017-04-06 07:52:31

标签: php oop

我想做这样的事情:

class myclass{

   public static function(__class__ $param){
    // do somthing
   }
}

__class__self::class以及static无效。

我应该怎么做

3 个答案:

答案 0 :(得分:3)

只需使用self

class A 
{
    public function foo(self $arg)
    {
        var_dump($arg);
    }
}

$a = new A();
$a->foo($a); // object(A)#1 (0) { }
  

不,但是,伙计们,假设这个类是扩展的,他可能想确保调用此方法使用子类,而不是父类

可以手动限制子类的此合约,如其他anwsers(instanceof等)所示,但它违反了Liskov substitution principle

子类应始终满足超类的约定。在良好的设计中,您不应该缩小重写方法中的参数类型。

允许扩展:Contravariant method argument type和PHP 7.2部分supports

答案 1 :(得分:2)

如果你想为子类动态强制执行,我担心这是不可能的。在这种情况下你能做的最好就是这样:

class myclass {
    public static function doStuff(self $a) {
        if (!$a instanceof static) {
            throw new InvalidArgumentException(sprintf('First argument must be of type %s', static::class));
        }
        // Do things with $a
    }
}

答案 2 :(得分:1)

你所问的内容在强类型语言中没那么有意义,所以我不认为这是你可以在PHP中做的事情。

考虑一下:

abstract class A {
     public abstract function a(A $myTypeObject);
}

class B extends A { 
     public function a(B $myTypeObject) {
         return $this;
     }
}

现在这段代码的问题在于它不存在,因为被覆盖的函数必须与父函数匹配相同的签名。在强类型语言中a实际上是一个重载,因此B将有2个a声明,一个接受A,另一个接受B。但是在PHP中,您只会得到一个解析错误。如果您真的想要执行某些操作,则需要运行时检查:

abstract class A {
     public function a($myTypeObject) {
          if (!($myTypeObject instanceof static)) {
              throw new \Exception("Invalid type");
          }
     }
}