2015-07-02 40 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