我想做这样的事情:
class myclass{
public static function(__class__ $param){
// do somthing
}
}但是__class__和self::class以及nor static不起作用。
我该怎么做呢?
发布于 2017-04-06 15:59:35
只需使用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。
子类应该始终满足父类的约定( contract )。在良好的设计中,您不应该缩小被覆盖方法中的参数类型。
允许加宽:Contravariant method argument type和PHP7.2部分supports它。
发布于 2017-04-06 16:00:41
如果您想对子类动态执行此操作,恐怕这是不可能的。在这种情况下,您能做的最好的事情是:
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
}
}发布于 2017-04-06 16:02:22
您所要求的在强类型语言中没有多大意义,所以我不认为在PHP中可以做到这一点。
请考虑以下内容:
abstract class A {
public abstract function a(A $myTypeObject);
}
class B extends A {
public function a(B $myTypeObject) {
return $this;
}
}现在,这段代码的问题是它不能存在,因为被覆盖的函数必须与父函数匹配相同的签名。在强类型语言中,a实际上是一个重载,因此B将有两个a声明,一个接受A,另一个接受B。然而,在PHP中,你只会得到一个解析错误。如果你真的想强制执行一些东西,你需要运行时检查:
abstract class A {
public function a($myTypeObject) {
if (!($myTypeObject instanceof static)) {
throw new \Exception("Invalid type");
}
}
}https://stackoverflow.com/questions/43249010
复制相似问题