【问题标题】:Use a variable in a function inside another function在另一个函数内部的函数中使用变量
【发布时间】:2014-07-31 10:12:06
【问题描述】:

我有这两个功能:

public function desplubicarItem(){
    $item_id = JRequest::getCMD('id');
    $app = JFactory::getApplication();

    $db = JFactory::getDbo();
    $query = 'UPDATE #__k2_items SET published=0 WHERE id='.$item_id;
    $db->setQuery($query);
    $db->query();
}

public function getCuponesUtilizados(){
    $db = JFactory::getDbo();
    $query = 'SELECT count(item_id) as contador 
                FROM #__cuphoneo_subscripcion as cs 
                LEFT JOIN #__k2_items as k2i ON k2i.id = cs.item_id 
                WHERE cs.estado=0 AND k2i.id='..' GROUP BY cs.item_id';
    $db->setQuery($query);
    $resultado = $db->loadObject();

    return $resultado;
}

我想在第二个函数中的第一个函数中使用变量$item_id。我该怎么做?

【问题讨论】:

    标签: php function oop joomla scope


    【解决方案1】:

    您可以将其设为属性,也可以将其设为参数或组合。

    由于它是一个公共函数,您需要确保已设置参数的属性或值。例如,您可以将其作为必需参数添加到函数中,以便在调用时必须提供它,或者您可以将其添加为 $item_id = null 参数,然后,如果未设置,则从请求中获取值(就像你在第一个函数中所做的那样),但有条件。例如:

    public function desplubicarItem($item_id = null)
    {
       $this->item_id = $item_id != null ? : JRequest::getCMD('id');
    ...
    }
    

    您可以将其添加到您的类的构造函数中,但是您必须在构造函数中处理相同的问题。但这真的取决于整个班级在做什么。

    这样做的一个原因是:如果您想在 id 不是来自请求的情况下使用这些方法,例如,如果您从查询中获取 id,该怎么办?我不会对您的方法施加这种限制,只需在未直接提供值的情况下进行回退即可。否则您将真正限制您的灵活性。

    【讨论】:

      【解决方案2】:

      您似乎是在课堂上写作。
      您可以在您的类中创建一个属性并将数据放入其中,以便稍后在您的其他方法中使用它,如下所示:

      ...
      public $item_id;
      public function desplubicarItem(){
          $this->item_id = JRequest::getCMD('id');
      ...
      

      请注意,现在您必须在方法中使用 $this->item_id

      或者您可以在第一个函数中调用第二个函数并传递变量(如果您可以调用一个方法并从两个函数中获取一个结果)。

      public function desplubicarItem(){
          ...
          $this->getCuponesUtilizados($item_id);
      }
      
      public function getCuponesUtilizados(item_id){
          // now you can use $item_id here
      }
      

      【讨论】:

      • 最好创建一个 setter,而不是使用当前方法,这会不必要地访问数据库并要求您始终取消发布您在其他方法中使用的任何项目。
      【解决方案3】:

      有多种方法可以实现这一点。取决于从哪里调用函数以及您到底想要做什么。

      例如,您可以将 $item_id 设为您的第一个函数的返回值

      public function desplubicarItem(){
          $item_id = JRequest::getCMD('id');
          ...
          return $item_id
      }
      

      然后在第二个函数中为其添加一个参数:

      public function getCuponesUtilizados($item_id){
      }
      

      那么你可以这样称呼他们:

      $this->getCuponesUtilizados(desplubicarItem());
      

      并使用第一个函数的返回值作为参数,将您的 $item id 直接放入第二个函数中。

      但这只是众多可能性中的一种,它实际上取决于您的代码/类设计,这对您来说是最好的方式。

      【讨论】:

        【解决方案4】:

        示例,使用类属性:

        public function desplubicarItem(){
            $this->item_id = JRequest::getCMD('id');
            $app = JFactory::getApplication();
        
            $db = JFactory::getDbo();
            $query = 'UPDATE #__k2_items SET published=0 WHERE id='.$this->item_id;
            $db->setQuery($query);
            $db->query();
        }
        
        public function getCuponesUtilizados(){
            //you can now access $this->item_id inside getCuponesUtilizados
            echo $this->item_id; 
            $db = JFactory::getDbo();
            $query = 'SELECT count(item_id) as contador 
                        FROM #__cuphoneo_subscripcion as cs 
                        LEFT JOIN #__k2_items as k2i ON k2i.id = cs.item_id 
                        WHERE cs.estado=0 AND k2i.id='..' GROUP BY cs.item_id';
            $db->setQuery($query);
            $resultado = $db->loadObject();
        
            return $resultado;
        }
        

        【讨论】:

        • 请注意,这只有在调用 getCuponesUtilizados() 之前总是调用 desplubicarItem() 时才有效,这看起来确实很昂贵(运行更新只是为了从请求中获取 item_id)。
        【解决方案5】:

        声明一个类属性 item_id 并在您想要的每个方法中访问它:

        private $item_id;
        

        并且用$this->item_id代替$item_id

        【讨论】:

        • 我不会将其作为私有财产,而且您仍然需要在某处设置值。此外,如果您将其设为私有 Joomla codestyle convnetions 将强制要求 $_item_id
        猜你喜欢
        • 2019-03-30
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 2017-09-22
        • 1970-01-01
        • 2019-07-03
        相关资源
        最近更新 更多