2010-12-21 15 views
2

Ich baue dieses SMS-Benachrichtigungssystem, das 10 Mal kostenlose SMS zu bestimmten Zeiten an das Web-Mitglied senden wird, und nachdem ein bestimmtes Mitglied 10 Mal erreicht hat, würde das System ein letztes Benachrichtigungssystem senden „dies ist der letzte freie SMS Benachrichtigung“, ich lerne derzeit PHP OOP und versuchen, eine OOP aproach auf dieserPHP OOP brauche Beratung

zu verwenden, ohne eine weitere hier nicht mein Code:

<?php 
class SmsBonus { 
//bonus_sms fields = id, member_id, counter, end_status 

public static function find_member($id=0){ 
    //query to find a certain member 
} 

public function add_counter($id=0){ 
    //query to increment the value of counter field 
} 

public function status_check($id=0){ 
    //query to check whether the given member's counter has reach the number 10 
} 

public static function send_sms($id, $message){ 
    $found = $this->find_member($id); 
    $status_check = $this->status_check($id); 

    if(!empty($found) && !empty($status_check) && $found->counter == 10){ 
     //send the sms notification saying that this member has reach the end of the bonus period 

     //update this member's end_status table to 1 
    }else{ 
     //send the regular notification 
    } 
} 

} 
?> 

würde diese Zeilen:

$found = $this->find_member($id); 
$status_check = $this->status_check($id); 

funktionieren wie erwartet (ich kann dies nicht testen, weil ich dies derzeit auf lokaler Ebene baue)? und ist dies eine Best Practice in Bezug auf OOP-Ansatz? oder mache ich das falsch?

Ich brauche Beratung, vielen Dank.

EDIT:

natürlich auf meinem ursprünglichen Code i die Klasse erklären, sie ist traurig, dass durch nicht hier schreiben verwirrt alle: D, ich bin eigentlich auf der Suche nach einer Art von Antwort (Beratung), die die spitz So sollte ich einen Best-Ansatz (Best Practice) für meine Codes (in diesem Fall Methoden) implementieren, Dinge, um die ich mir Sorgen mache ist, dass ich die Anforderungen wie KISS oder DRY nicht erfülle

AKTUALISIEREN ich schaffe es, einige Änderungen basierend auf Ihren Vorschlägen zu tun, wie sieht das aus?

<?php 
    class SmsBonus{ 
     //bonus_sms fields = id, member_id, counter, end_status 
     protected $max_sms = 10; 

     public $id; 
     public $member_id; 
     public $counter; 
     public $end_status; 

     public function find_member($id=0){ 
      //query to find a certain member 
     } 

     public function add_counter($id=0){ 
      //query to increment the value of counter field 
     } 

     public function status_check($id=0){ 
      //query to check whether the given member's counter has reach the number 10 
     } 


     public function update_status($id=0){ 
      //query to update when a certain member reach its sms bonus limit 
     } 

     protected function can_still_send_sms($member_id){ 
      $found   = $this->find_member($member_id); 
      $status_check = $this->status_check($id); 
      return !empty($found) && $found->counter < $this->max_sms && !empty($status_check); 
     } 

     public function send_sms($id, $message){ 
      $phone = Phone::find_member($id); // 
      if ($this->can_still_send_sms($id)) {  
       //send the sms notification saying that this member has reach the end of the bonus period 

       $this->update_status($id); 
      }else{    
       //send the regular notification 

       $this->add_counter($id); 
      } 
     } 
    } 
    $sms_bonus = new SmsBonus(); 
?> 

Antwort

2

Nun, ich denke, OOP geht es hauptsächlich darum, sinnvolle Aktionen zu erstellen, die einfach wiederzuverwenden sind und vor allem einige Monate später (oder wenn jemand anders Ihren Code liest) herauszufinden, was passiert, wenn Sie Ihren Code erneut aufrufen. was mehr oder weniger das Gleiche ist). Wenn Sie Ihre member gefunden haben, können Sie dann Logik statt auf der id ausführen. Also, in diesem Fall kann es besser sein, Ihre Methoden wie diese zu erstellen, zum Beispiel:

protected $max_sms_messages = 10; 

protected function can_still_send_sms($member){ 
    return !empty($member) && $member->counter < $this->max_sms_messages; 
} 

public function send_sms($id, $message){ 
    $found = $this->find_member($id); 
    if ($this->can_still_send_sms($found)) { // or even if($found->can_still_send_sms()), if you want to implement it that way 

     //send the sms notification saying that this member has reach the end of the bonus period 

     //update this member's end_status table to 1 
    }else{ 
     //send the regular notification 
    } 
} 

Auch für den Datensatz, können Sie nicht rufen nicht-statische Methoden aus statischen Methoden.

+0

ich habe meine Frage aktualisiert, wie geht's Das ? Vielen Dank – littlechad

1

Sie müssen Ihren Code in einer Klassendeklaration wickeln

class SMSNotification { 
... 
} 

Und Sie können auch

function __construct() { 

Ein Grund hierfür einen Konstruktor zu erstellen, so dass Sie festlegen können, private Variablen für die Klasse, wenn sie instanziiert wird.

instanziert die Klasse wie folgt:

$sms = SMSNotification() 

Wollen Sie diese in eine Datenbank für die Zählerinkrement werden zu verbinden. Als was Sie normalerweise mit einem oop-Ansatz tun würden, ist eine separate Klasse, die diese Verbindung handhabt, so dass, wenn Sie auf diesem ganzen Projekt aufbauen wollten, alles auf die gleiche Weise mit einer Datenbank verbunden wäre.

Die beiden Codezeilen Sie eingefügt sind ein bisschen anders:

$found = $this->find_member($id); 

Sie find_member eine statische Funktion gemacht haben (was wahrscheinlich ist, was ich getan hätte), so dass Sie die Funktion aufrufen kann, ohne erstellen neues Klassenobjekt Davon abgesehen ist es nicht von Wert $, da es nicht Teil der aktuellen instanziierten Klasse ist.So müssen Sie es nennen wie (mit meinem Beispiel SMSNotification):

$found = SMSNotification::find_member($id); 

Dies sagt PHP für eine statische Funktion find_member

Die andere Zeile Code arbeiten sollte in Ordnung genannt aussehen:

$status_check = $this->status_check($id); 
+0

Ich habe die Klasse deklariert, ich habe das nicht auf meine Frage geschrieben, und ich weiß auch, wie man instanziiert, aber danke für das Hinweis: D – littlechad

+0

okay sicher, nur angenommen, weil Sie sagten "Hier ist mein Code". Du willst nicht die 2 Klammern setzen, wenn du eine Klasse wie oben deklarierst "Klasse SmsBonus() {" sollte "Klasse SmsBonus {" sein – dewy

+0

oh yeah, Tippfehler ich hatte es eilig: p – littlechad

0

Laut OOP können Sie $this->find_member($id) nicht auf einer statischen Elementfunktion aufrufen. Außerdem hast du überhaupt keine Klasse deklariert, also ist $this bedeutungslos (soweit ich mich an PHP erinnere). Sie wollten eine Klasse SmsClient deklarieren, die aus der DB-Abfrage initialisiert werden würde, die Mitgliedsvariablen ausfüllt. Ihre statische find_member($id=0) Funktion würde db von id Abfrage und Rück initialisierte Objekt von SmsClient mit id = $id

class SmsClient 
{ 
private $id; 
private $nSmsSent; 

public __construct($id) 
{ 
    $res = DAL->GetClient($id); 
    //initialize vars here 
} 

public send_sms(...) 
{ 
    $this->nSmsSent++; 
} 
} 
0

Dewi anhören.

Wie auch immer, eine gute Möglichkeit zu testen, ob Sie die richtige Syntax verwenden, ist der Inhalt der find_member() und status_check() Funktionen kommentieren und einige willkürliche Werte zurückgeben: Wenn die Werte tatsächlich zurückgegeben werden, tun Sie es Recht.