这不是一个真正的问题,而是更多的问题。 我的问题是它是如何被“编程”的。 虽然可能不太清楚。PHP OOP/MVC方法
所以我的问题是,我必须使多种方法从数据库中检索数据吗?例如,我有一个名为FRUITS的表。 它包含添加水果的ID,名称和日期。 现在我想根据给定的ID获取水果的名称,稍后在脚本中我也想获得水果的日期。
我应该做一个方法,比如get_fruit($ id),它返回名称和日期,还是两个单独的方法get_name($ id)和get_date($ id)?
在此先感谢。
这不是一个真正的问题,而是更多的问题。 我的问题是它是如何被“编程”的。 虽然可能不太清楚。PHP OOP/MVC方法
所以我的问题是,我必须使多种方法从数据库中检索数据吗?例如,我有一个名为FRUITS的表。 它包含添加水果的ID,名称和日期。 现在我想根据给定的ID获取水果的名称,稍后在脚本中我也想获得水果的日期。
我应该做一个方法,比如get_fruit($ id),它返回名称和日期,还是两个单独的方法get_name($ id)和get_date($ id)?
在此先感谢。
您应该使用一个包含所有必需数据的对象。例如:
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();
}
}
总结起来......第一种方法是容易实现的,是完全自动化的......你并不需要大量的代码和来源将是几乎每个类别的相同。第二种方法需要更多的编码,但给你一个更好的控制。例如:
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);
}
}
}
或者你可以用总组合并为您的getter/setter第一,比尝试访问属性直接...
这里是代码如何使用一个函数来获得不同的字段的值。
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');
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;
}
明确的解释。谢谢。 __set和__get应该用于什么?我读了无法访问的对象(so..Private对象?) – Roel 2012-02-02 10:23:51
@Roel我已经编辑了答案,你现在能理解这一点吗? – Vyktor 2012-02-02 10:46:31