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