Методы PHP OOP / MVC - PullRequest
       1

Методы PHP OOP / MVC

2 голосов
/ 02 февраля 2012

Это на самом деле не проблема, а скорее вопрос.Мой вопрос в том, как это «должно быть» запрограммировано.Это может быть не слишком ясно, чтобы объяснить, однако.

Так что мой вопрос;я должен сделать несколько методов для извлечения данных из базы данных?Например, у меня есть таблица с именем FRUITS.Он содержит идентификатор, имя и дату, когда был добавлен фрукт.Теперь я хочу получить название фрукта на основе заданного идентификатора, а позже в сценарии я хочу также получить дату фрукта.

Должен ли я создать один метод, например get_fruit ($id), который возвращает имя и дату, или два отдельных метода get_name ($ id) и get_date ($ id)?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Вы должны использовать один объект, который будет содержать все необходимые данные.Например:

class Fruit {

    protected ... variables;

    public function getId() {...}
    public function getDate() {...}
    ...

}

Также реализация __set и __get будет хорошим примером использования полного потенциала php.

Вы также можете реализовать метод save() (или расширить строку базы данных).класс, такой как Zend_Db_Table_Row.

Таким образом, весь код будет выглядеть так:

$fruit = $model->getFruid( 7); // $id = 7 :)
echo $fruit->id; // would call internally $fruit->__get( 'id')
echo $fruit->date;

// And modification:
$fruit->data = '2011-08-07';
$fruit->save();

РЕДАКТИРОВАТЬ: использование отдельных методов для загрузки определенных данных полезно (только?) когда вам нужно загрузить большой объем данных (таких как длинные тексты), который требуется только в одном месте вашего кода и может повлиять на производительность.

РЕДАКТИРОВАТЬ 2: (ответ на комментарий): __get и __set вызываются при попытке доступа к неопределенному свойству объекта, например:

class Foo {
     public $bar;
     public function __get( $name){
         echo $name "\n";
         return 'This value was loaded';   
     }
}

// Try to use
Foo $foo;
echo $foo->bar . "\n";
echo $foo->foo . "\n";

Существует два "больших" подхода к этому, о которых я знаю:

// First use __get and __set to access internal array containing data
class DbObject {
protected $data = array();

public function __get( $propertyName){
    // Cannot use isset because of null values
    if( !array_key_exits( $propertyName,$this->data)){
         throw new Exception( 'Undefined key....');
    }

    return $this->data[ $propertyName];
}

// Don't forget to implement __set, __isset
}

// Second try to call getters and setter, such as:
class DbObject {
public function getId() {
   return $this->id;
}

public function __get( $propertyName){
    $methodName = 'get' . ucfirst( $propertyName);
    if( !method_exits( array( $this, $methodName)){
        throw new Exception( 'Undefined key....');
    }
    return $this->$methodName();
}
}

Подводя итог ... Первый подход прост в реализации, полностью автоматизирован ... Вам не нужно большое количество кода, и исходные коды будут практически одинаковыми для каждого класса. Второй подходтребуется больше кодирования, но дает вам лучший контроль. Для экзаменаple:

public function setDate( $date){
    $this->date = date( 'Y-m-d h:i:s', strtotime( $date));
}

Но, с другой стороны, вы можете сделать это с первым подходом:

class Fruit extends DbObject {
public function __set( $key, $val){
  switch( $key){
     case 'date':
       return $this->setDate( $val);

     default:
       return parent::__set( $key, $val);
  }
}
}

Или вы можете использовать общую комбинацию и сначала проверять геттер / сеттер, а потом пытатьсяполучить доступ к собственности напрямую ...

0 голосов
/ 02 февраля 2012
class  data_retrieve
{
    public $tablename;
    public $dbname;
    public $fieldset;
    public $data_array;
    public $num_rows
    function __construct()
    {
        $this->tablename='junk';
        $this->dbname='test';
        $this->fieldset=array('junk_id');   

    }
function getData($where_str)
    {
        $this->data_array= array();

                   global $dbconnect, $query;
        if($dbconnect ==0 )
        {
            echo" Already Connected \n ";
            $dbconnect=db_connect("objectdb") or die("cannot connect");
        }

        $where_str;

        if(empty($where_str))
        {
            $where_str=NULL;
        }
        else
        {
             $where_str= "where". $where_str ;
        }

$query= "select * from $this->tablename $where_str";
$record= mysql_query($query) or die($query);
        $recNo=mysql_num_rows($record); 

        $this->num_rows=$recNo;
                    while($row= mysql_fetch_assoc($record))
        {
            $this->data_array[]=$row;
        }

        mysql_free_result($record);

        return $this->data_array;
}

class fruit extends data_retrieve
{

function __construct()
    {
        parent::__construct();
        $this->tablename='fruit';
        $this->fieldset=array('fruit_id','fruit_name','date');

    }
}

, то в вашем файле создайте фруктовый объект типа

$str="fruit_id=5";
$fruit_data = new  fruit();

$records=$fruit_data->getData($str);

для отображения

foreach($records as $row )
{
print <<< HERE
<label class='table_content' > $row[fruit_id]</label>
<label class='table_content' > $row[fruit_name]</label>
<label class='table_content' > $row[date]</label>
HERE;
}
0 голосов
/ 02 февраля 2012

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

function get_fruit($id,$field = ''){

   $sql = "select * from table_name where id = $id";
   $result = mysql_fetch_object(mysql_query($sql));

   if($field != ''){
     return $result->$field;
   }else{
     return $result;
   }
}

echo get_fruit (1, 'field_name');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...