[英]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.