[英]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替换原则 。
子类应始终满足超类的契约。 在良好的设计中,您不应缩小覆盖方法中的参数类型。
如果要对子类动态地执行此操作,恐怕是不可能的。 在这种情况下,您可以做的最好的事情是这样的:
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.