Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP为静态范围和实例范围提供了一种方法_Php_Static - Fatal编程技术网

PHP为静态范围和实例范围提供了一种方法

PHP为静态范围和实例范围提供了一种方法,php,static,Php,Static,在创建PHP助手方法时,我试图找到一种优雅的方法,使相同的方法可用于静态调用和实例调用,同时仍然能够在从实例调用调用时访问实例 考虑Entity类中的getModelName()方法: public static function getModelName($entity) { if (is_string($entity)) { $entity = ///query to return an entity object; r

在创建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模型(雄辩)。我原本认为这不相关,因为这是一个关于PHP方法作用域的一般性问题。读了这些评论之后,我觉得有必要提一提。实例化一个新的$entity只是一个选项,因为它将查询数据库。

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

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

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

因为在静态方法中无法访问
$this
,所以应该从不同的角度来看待这个问题

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

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

为什么不能简单地将$model属性和方法设置为静态?不能使用self::model?@EasyBB不,因为
$model
不是静态的。我只是不知道他在哪里创建模型lol@EasyBB$entity->model实际上是在实例化$entity时检索的数据库列。为什么不能简单地$model属性静态以及方法?不能使用self::model?@EasyBB否,因为
$model
不是静态的。我只是不知道他在哪里创建模型lol@EasyBB$entity->model实际上是在实例化$entity时检索的数据库列。谢谢。我已经更新了这个问题,基本上我使用的是Laravel雄辩的ORM,所以$entity不是一个简单的对象,我不需要重新查询数据库就可以实例化。谢谢。我已经更新了这个问题,基本上我使用的是Laravel雄辩的ORM,所以$entity不是一个简单的对象,我可以实例化而不必重新查询数据库。