繁体   English   中英

php oop-强制将静态方法的参数作为当前类的对象

[英]php oop - force static method's param to be object of current class

我想做这样的事情:

class myclass{

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

但是__class__self::class和nor static无法正常工作。

我应该怎么做

只需使用self

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

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

否,伙计们,假设该类已扩展,他可能想确保对该方法的调用使用子类,而不是父类。

可以手动将合同限制为子类,如其他anwsers( instanceof等)所示,但它违反了Liskov替换原则

子类应始终满足超类的契约。 在良好的设计中,您不应缩小覆盖方法中的参数类型。

允许扩展变量方法参数类型和PHP 7.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
    }
}

在强类型语言中,您要问的内容没有太大意义,因此我认为您无法在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声明接受A ,另一个接受B 但是在PHP中,您只会得到一个解析错误。 如果您确实想强制执行某些操作,则需要运行时检查:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM