Вы должны использовать один объект, который будет содержать все необходимые данные.Например:
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);
}
}
}
Или вы можете использовать общую комбинацию и сначала проверять геттер / сеттер, а потом пытатьсяполучить доступ к собственности напрямую ...