PHP ООП нужен совет - PullRequest
       0

PHP ООП нужен совет

2 голосов
/ 21 декабря 2010

Я создаю эту систему уведомлений смс, которая будет раз в 10 раз бесплатно посылать смс на основании определенного случая члену сети, и после того, как определенный член достигнет 10 раз, система отправит последнюю систему уведомлений, сообщающую, что «этопоследнее бесплатное смс-уведомление ", в настоящее время я изучаю PHP ООП и пытаюсь использовать подход ООП для этого

без дальнейших действий, вот мой код:

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

}
?>

будет это строки:

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

работает как ожидалось (я не могу проверить это, потому что в настоящее время я строю это на локальном)?и является ли это наилучшей практикой в ​​отношении подхода ООП?или я делаю это неправильно?

мне нужен совет, большое спасибо.

РЕДАКТИРОВАТЬ:

конечно, в моем исходном коде я объявляю класс, извинитето, что это не написано здесь, смущает всех: D, я на самом деле ищу какой-то ответ (совет), который указал, каким образом я должен реализовать наилучший подход (лучшую практику) в моих кодах (в данном случае методы), вещи, которые ябеспокоюсь о том, что я не отвечаю таким требованиям, как KISS или DRY

ОБНОВЛЕНИЕ Мне удается внести некоторые изменения на основе ваших предложений, как это выглядит?

<?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();
?>

Ответы [ 4 ]

2 голосов
/ 21 декабря 2010

Ну, я думаю, что ООП в основном заключается в создании осмысленных действий, которые легко использовать повторно, и, в особенности, облегчают выяснение того, что происходит, когда вы повторно просматриваете код несколько месяцев спустя (или когда кто-то еще читает ваш код,более или менее то же самое).Кроме того, когда вы нашли свой member, вы можете выполнить логику для него вместо id.Таким образом, в этом случае может быть лучше создать ваши методы, например так:

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

Кроме того, для записи нельзя вызывать нестатические методы из статических методов.

1 голос
/ 21 декабря 2010

Вы должны обернуть свой код в объявление класса

class SMSNotification {
...
}

И вы также можете создать конструктор

function __construct() {

Одна из причин этого заключается в том, что вы можете устанавливать частные переменные для класса, когда он создается.

вы создаете экземпляр класса следующим образом:

$sms = SMSNotification()

Будете ли вы подключать это к базе данных для увеличения счетчика. Как и то, что вы обычно делаете с oop-подходом, это имеете отдельный класс, который обрабатывает это соединение, так что если вы хотите построить весь этот проект, тогда все будет подключаться к базе данных одинаково.

Две вставленные вами строки кода немного отличаются:

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

вы сделали find_member статической функцией (что, вероятно, я бы и сделал), чтобы вы могли вызывать функцию без создания нового объекта класса. При этом он не имеет значения $ this, поскольку он не является частью текущего экземпляра класса. Поэтому вам нужно будет назвать его как (используя мой пример SMSNotification):

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

Это говорит php искать статическую функцию с именем find_member

Другая строка кода должна работать нормально:

$status_check = $this->status_check($id);
0 голосов
/ 21 декабря 2010

Слушайте Дьюи.

В любом случае, хороший способ проверить, используете ли вы правильный синтаксис, - закомментировать содержимое функций find_member() и status_check() и заставить их возвращать некоторые произвольные значения: если значения действительно возвращаются, вы ' делает все правильно.

0 голосов
/ 21 декабря 2010

Согласно ООП нельзя вызывать $this->find_member($id) для статической функции-члена.Кроме того, вы вообще не объявляли какой-либо класс, поэтому $this не имеет смысла (насколько я помню PHP).Вы, вероятно, хотели объявить некоторый класс SmsClient, который был бы инициализирован из заполнения запроса базы данных в переменных-членах.Ваша статическая find_member($id=0) функция будет запрашивать БД по id и возвращать инициализированный объект SmsClient с его id = $id

class SmsClient
{
 private $id;
 private $nSmsSent;

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

 public send_sms(...)
 {
  $this->nSmsSent++;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...