2012-02-02 3 views
2

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

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

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

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

ответ

3

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

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

EDIT: используя отдельные методы для загрузки определенных данных (только?), когда вам нужно загрузить большой объем данных (например, длинные тексты), которые требуются только на одном месте в вашем коде и будут влиять на производительность.

EDIT 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(); 
} 
} 

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

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

Четкого объяснения. Благодарю. __set и __get следует использовать для чего именно? Я читал недоступные объекты (так ... Частные объекты?) – Roel

+0

@Roel Я отредактировал ответ, вы можете понять суть сейчас? – Vyktor

0

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

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');

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