我想做这样的事情:
class myclass{
public static function(__class__ $param){
// do somthing
}
}
但__class__
和self::class
以及static
无效。
我应该怎么做
答案 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");
}
}
}