【问题标题】:PHP one method for both static and instanciated scopePHP 一种用于静态和实例化范围的方法
【发布时间】:2015-07-02 23:28:26
【问题描述】:

在创建 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 的实例,我希望能够直接调用它,因此我不需要传递 $entity 的实例作为参数每次:

$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;
        }

这个解决方案显然失败了,因为 $this 在静态方法中不可用。 有什么想法可以在没有两种不同方法的情况下解决这个困境吗?

感谢您的帮助!

更新 我正在使用 Laravel,所以 $entity 是一个数据库 ORM 模型(Eloquent)。我最初认为它不相关,因为这是关于 PHP 方法范围的一般问题。在阅读了 cmets 之后,我觉得值得一提。实例化一个新的 $entity 只是一个选项,因为它会查询数据库。

【问题讨论】:

  • 你为什么不能简单地让你的 $model 属性和方法一样静态?
  • 不能使用 self::model?
  • @EasyBB 否,因为$model 不是静态的
  • 知道了,我只是看不到他在哪里创建模型,哈哈
  • @EasyBB $entity->model 实际上是一个数据库列,在实例化 $entity 时正在检索。

标签: php static


【解决方案1】:

由于无法在静态方法中访问$this,因此您应该从不同的角度看待这个问题。

简单地说,$this 是当前类的一个实例,因此您需要实例化它,然后访问它的属性或方法。所以你可以这样处理:

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

【讨论】:

  • 谢谢。我已经更新了这个问题,基本上我使用的是 Laravel 的 Eloquent ORM,所以 $entity 不是一个简单的对象,我可以在不重新查询数据库的情况下实例化。
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多