2010-12-14 8 views
0

noch zu PHP-Klassen Gewöhnung so ein bisschen „help/guidance“ bittePHP-Klassen ist dies der richtige

ich eine Klasse wie dieses:

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

} 

Die Grenze kommt aus einer PHP-Funktion - und funktioniert.

Was ich wirklich gerne tun würde, ist extend Klassen für das obige Beispiel zu erstellen, die sagen $this-frm_url als eine Funktion. also auf der "Seite" rufe ich die Klasse $classcall = new class(); an aber anstatt echo $classcall->frm_url[$key]; zu gehen kann ich einfach eine Funktion wie diese aufrufen echo frm_url(); Also im obigen Beispiel gäbe es 2 extend Klassen für frm_urlID und eine für frm_url.

Auch in der "Master-Klasse" bin ich richtig in der Einstellung als Array? dh $this->frm_url[] als ohne, dass ich nicht scheinen kann, eine Schleife zu laufen, aber die Schleife scheint "über" komplex, wenn Sie es so tun, wie Sie (gut ich) eine Zählung der Array-Elemente bekommen müssen, dann führen Sie die Schleife so (wieder I) habe eine for() Erklärung dann eine foreach(). Scheint mir langgezogen.

Vielen Dank im Voraus.

Antwort

2

Zuerst definieren: Bitte nicht Globals verwenden. Wenn Sie "global" verwenden müssen, besteht eine Wahrscheinlichkeit von 90%, dass Ihr Entwurf schlecht ist. Entweder übergeben Sie $ DBH und $ limit als Parameter an __construct ($ dbh, $ limit) oder definieren Sie sie als statische Eigenschaften von ansa_accounturl_query. Wenn Sie sie als statische Eigenschaften definieren, sind die Werte für alle Instanzen Ihrer Klasse identisch.

Zweitens: Wenn Sie eine Methode aufrufen möchten, ohne zuerst eine Instanz zu erstellen, können Sie die Methoden auch statisch deklarieren. Dann können Sie sie wie folgt aufrufen:

classname::myMethod(parameter); 

, wenn Sie immer in der gleichen db und die gleiche Einstellung verwenden, würde ich vorschlagen, dass Sie eine Klasse mit statischen propertys und 3 statische Methoden erstellen.

+0

Ist es nicht merkwürdig zu sagen * benutze keine Globals *, aber schlage dann vor, eine statische Klasse zu verwenden? Statische Aufrufe führen die gleiche Abhängigkeit vom globalen Gültigkeitsbereich wie Globals. – Gordon

+0

Zumindest sind sie dann gekapselt. –

+0

Ich denke, er wollte nicht "global" verwenden, um externe Variablen in den Geltungsbereich zu bringen. Dem stimme ich zu, da die Variable "global" später keinen Zusammenhang hat. Statische Variablen/Klassen setzen die Variable zumindest in Kontext.Sozusagen selbstdokumentierend, damit Sie wissen, wo es deklariert wurde. –

0

Was ich wirklich tun möchte, ist Klassen für das oben Beispiel erweitern schaffen, die diese-frm_url als Funktion gibt sagen $. so dass auf der "Seite" ich rufen Sie die Klasse $ classcall = new class(); aber anstatt zu gehen echo $ classcall-> frm_url [$ key]; Ich kann rufen Sie einfach eine Funktion wie dieses Echo frm_url(); Also im obigen Beispiel gäbe es 2 extend Klassen 1 für frm_urlID und eine für frm_url.

echo frm_url(); wird nicht funktionieren. Sie haben $classcall->frm_url[$key]; zu verwenden, wenn Sie eine Funktion wie

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']); 
 
Verwandte Themen