2010-12-14 45 views
0

encore se habituer à des classes PHP donc un peu de « aide/conseils » s'il vous plaîtclasses PHP est ce droit

J'ai une classe comme ceci:

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

} 

La limite provient d'une fonction PHP - et travaille.

Ce que je voudrais vraiment faire est de créer des classes d'extension pour l'exemple ci-dessus qui donne par exemple $this-frm_url en tant que fonction. de sorte que sur la "page" j'appelle la classe $classcall = new class(); mais plutôt que d'avoir à aller echo $classcall->frm_url[$key]; Je peux juste appeler une fonction comme ceci echo frm_url(); Donc dans l'exemple ci-dessus il y aurait 2 extensions classes un pour frm_urlID et un pour frm_url.

De même, dans la "master class", est-ce que je suis dans le réglage en tant que tableau? $this->frm_url[] sans cela je ne peux pas sembler exécuter une boucle mais la boucle semble "plus" complexe si vous le faites de cette façon que vous (bien je) dois obtenir un compte des éléments du tableau puis exécutez la boucle de sorte que vous (encore I) ont une instruction for() puis un foreach(). Ça me semble long.

Merci à l'avance.

Répondre

2

Première: S'il vous plaît ne pas utiliser globals. Si vous utilisez "global", il y a 90% de chances que votre design soit mauvais. Transmettez $ DBH et $ limit en paramètres à __construct ($ dbh, $ limit) ou définissez-les comme des propriétés statiques de ansa_accounturl_query. Si vous les définissez comme propriétés statiques, les valeurs seront toujours identiques pour toutes les instances de votre classe.

Deuxième: Si vous souhaitez appeler une méthode sans créer d'instance, vous pouvez également déclarer les méthodes statiques. Ensuite, vous pouvez les appeler comme ceci:

classname::myMethod(parameter); 

si vous utilisez le même AllWays db et le même réglage, je vous suggère de créer une classe avec propertys statiques et 3 méthodes statiques.

+0

N'est-ce pas bizarre de dire * n'utilisez pas les globals * mais suggérez d'utiliser une classe statique? Les appels statiques introduisent la même déperdition sur la portée globale que les globaux. – Gordon

+0

Au moins, ils sont encapsulés alors. –

+0

Je pense qu'il voulait ne pas utiliser "global" pour mettre les variables externes dans la portée. Je suis d'accord avec cela, puisque la variable "globale" n'a plus de contexte par la suite. Les variables/classes statiques mettent au moins la variable en contexte.Sorte d'auto-documentation afin que vous sachiez où il a été déclaré. –

0

Ce que je voudrais vraiment faire est de créer étendre les classes pour l'exemple ci-dessus qui donne dire $ ce frm_url- en fonction. de sorte que sur la "page" I appelez la classe $ classcall = new class(); mais plutôt que d'avoir à aller echo $ classcall-> frm_url [$ key]; Je peux juste appeler une fonction comme cet echo frm_url(); Ainsi, dans l'exemple ci-dessus , il y aurait 2 extensions classes un pour frm_urlID et un pour frm_url.

echo frm_url(); ne fonctionnera pas. Vous devez utiliser $classcall->frm_url[$key]; sauf si vous définissez une fonction comme

function frm_url($key){ 
    if (!$key) $key = 0; 
    $classcall = new ansa_accounturl_query(); 
    return $classcall->frm_url[$key]; 
} 
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']);