2015-07-02 42 views
1

在創建一個PHP的輔助方法,我想找到可供靜態調用一個優雅的方式具有相同的方法和實例化調用,同時仍然能夠訪問實例時從實例調用中調用。靜態和實例化範圍PHP一個方法

考慮一個Entity類中getModelName()方法:

public static function getModelName($entity) { 

     if (is_string($entity)) { 

      $entity = ///query to return an entity object; 

      return !empty($entity) ? $entity->model : false; 

     } 

     if (is_a($entity, "\namespace\path\Entity")) { 

      return $entity->model; 

     } 

     return false; 
} 

由於整個應用程序的不同類使用此方法,並且他們中的一些已經有$實體的實例,我希望能夠直接調用它所以我不需要每次都通過$實體的實例作爲參數:

$entity->getModelName(); 

本身需要能夠做的方法:

public static function getModelName($entity = null) { 

      if (is_string($entity)) { 

       $entity = ///query to return an entity object; 

       return !empty($entity) ? $entity->model : false; 

      } 

      if (empty($entity)) { 
       //this is where it fails of course since $this is not available 
       //in a static method 
       return $this->model; 
      } 

      return false; 
     } 

該解決方案顯然失敗,因爲$這不是一個靜態方法中可用。 任何想法如何解決這個困境,而沒有2種不同的方法?

感謝您的幫助!

UPDATE 我正在使用Laravel所以$ entity是一個數據庫ORM模型(Eloquent)。我不認爲它最初是相關的,因爲這是關於PHP方法範圍的一般問題。閱讀評論後,我認爲這很重要。實例化一個新的$實體只是一個選項,因爲它必須查詢數據庫。

+0

爲什麼你不能簡單地使你的$ model屬性靜態以及方法? –

+0

不能使用self :: model? – EasyBB

+0

@EasyBB沒有因爲'$ model'也不是一成不變的 – Yang

回答

0

既然沒有辦法訪問$this靜態方法裏面,你應該看看這個問題從不同的角度。

簡而言之,$this是當前類的實例,因此,你需要實例,然後訪問它的屬性或方法。所以你可以這樣處理:

if (empty($entity)) { 
    $instance = new self(); 
    return $instance->model; 
} 
+0

謝謝。我已經更新了這個問題,基本上我使用Laravel的Eloquent ORM,所以$ entity不是一個簡單的對象,我可以在不重新查詢數據庫的情況下實例化。 – Yani