簡體   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