PHP类是正确的

时间:2010-12-14 11:00:01

标签: php class

仍然习惯了PHP课程,所以请“帮助/指导”

我有一个这样的课程:

class ansa_accounturl_query {

    function __construct() {

     global $DBH;
     global $limit;
     $STH = $DBH->query("SELECT frm_url.frm_urlID,frm_url.frm_url FROM frm_url WHERE frm_url.accountID='SOMETHING' ".$limit." ");
     $STH->setFetchMode(PDO::FETCH_OBJ);  
     $this->noforms = $STH->rowCount();  
     while($row  = $STH->fetch()): 
         $this->frm_urlID[]  = $row->frm_urlID;
         $this->frm_url[] = $row->frm_url;
     endwhile;
    }

}

限制来自PHP函数 - 并且有效。

我真正想要做的是为上面的例子创建扩展类,它将$this-frm_url作为一个函数。所以在“页面”上我调用了类$classcall = new class();,而不是必须去echo $classcall->frm_url[$key];我可以调用这样的函数echo frm_url();所以在上面的例子中会有2个扩展一个用于frm_urlID,一个用于frm_url。

另外,在“大师班”中我是否正确设置为数组?即$this->frm_url[]如果没有我似乎无法运行循环但是循环看起来似乎“过度”复杂如果你这样做,因为你(我)必须得到数组项目的计数然后运行循环所以你(我再次)有一个for()语句,然后是foreach()。似乎对我很感兴趣。

谢谢你。

3 个答案:

答案 0 :(得分:2)

第一: 请不要使用全局变量。 如果你必须使用“全球”,那么你的设计有90%的可能性是坏的。 将$ DBH和$ limit作为参数传递给__construct($ dbh,$ limit)或将它们定义为ansa_accounturl_query的静态属性。 如果将它们定义为静态属性,则对于类的所有实例,值仍然相同。

第二: 如果要在不创建实例的情况下调用方法,则可以将方法声明为static。然后你可以像这样打电话给他们:

classname::myMethod(parameter);

如果你总是使用相同的db和相同的设置,我建议你用静态属性和3个静态方法创建一个类。

答案 1 :(得分:0)

  

我真正想做的是   为上面创建扩展类   给出$ this-frm_url的例子   作为一个功能。所以在“页面”我   调用类$ classcall = new   类();但不必去   echo $ classcall-> frm_url [$ key];我可以   只需调用类似这个echo的函数   frm_url();所以在上面的例子中   将有2个扩展类一个   用于frm_urlID,另一个用于frm_url。

echo frm_url();无效。除非您定义类似

的函数,否则必须使用$classcall->frm_url[$key];
function frm_url($key){
  if (!$key) $key = 0;
  $classcall = new ansa_accounturl_query();
  return $classcall->frm_url[$key];
}

答案 2 :(得分:0)


<?php

 class ansa_accounturl_query {
   private static $FIND_ALL_QUERY = "SELECT frm_url.frm_urlID,frm_url.frm_url FROM frm_url WHERE frm_url.accountID='SOMETHING' %s"; 

   private $dbh;

   public function __construct( $dbh ) {
     $this->dbh = $dbh;
   }

   public function findUrls() {
      $query = $this->dbh->query(vsprintf($queryString, array( func_get_args() ) ) );

       $query->setFetchMode(PDO::FETCH_OBJ);  

       $result = array();
       $result["count"] = $query->rowCount();
       $result["records"] = array();
       while( null !== ( $row  = $query->fetch() ) ) { 
          $result["records"][] = array(
              "id" => $row->frm_urlID,
              "url" => $row->rm_url
          );
       }

      return $result;
   }

}

$ansaQuery = new ansa_accounturl_query($DBH);
$result = $ansaQuery->findUrls();
foreach ( $result['records'] as $row ) {
   print sprintf("ID: %d; URL: %s", $row['id'], $row['url']);
}

print sprintf("URLs count: " . $result['count'] );