2012-02-17 17 views
1

Im .NET程序员,但在PHP中是全新的。我为此奋斗了好几个小时。PHP - 简单的代码 - 类似于MVC的部分

我需要简单的从接口到数据库的数据传输。我有这样的事情:

$default = new stdClass(); 

      // default values - all of them should be set to default value 
      // some of them will be overwritten later, but only one of them 


    $default->{'val-string'} = ''; // default values start 
    $default->{'val-int'} = 0; 
    $default->{'val-float'} = 0; 
    $default->{'val-image'} = ' '; 
    $default->{'val-datetime'} = 0; 
    $default->{'val-boolean'} = false; // default values end 


    $container = array(); 


    $row = clone $default; 
    $row->{'field_id'} = 1; 
    $row->{'field_name'} = $nameoffield1; 
    $row->{'val-string'} = 'Diffrent types are filled for diffrent rows'; 
    $container[] = $row; 

    $row = clone $default; 
    $row->{'field_id'} = 2; 
    $row->{'field_name'} = $nameoffield2; 
    $row->{'val-int'} = $valueoffield2; 
    $container[] = $row; 

    $row = clone $default; 
    $row->{'field_id'} = 3; 
    $row->{'field_name'} = $nameoffield3; 
    $row->{'val-datetime'} = current_time(); 
    $container[] = $row; 

    // there 
    // is 
    // a lot 
    // of these 
      //rows 

$result = $database->insertContainer($db_session, $container); 

在年底需要一场这样的“伪.NET和PHP混”

list_of_rows.AddItem(makeRow($field_id1, $name1, (int)$dataforint))); 
list_of_rows.AddItem(makeRow($field_id2, $name2, (string)$dataforstring)); 
list_of_rows.AddItem(makeRow($field_id3, $name3, (date)$datafordate)); 
list_of_rows.AddItem(makeRow($field_id4, $name4, (boolean)$dataforboolean)); 

$result = $database->insertContainer($db_session, list_of_rows); 

如果超载像这样在PHP中是不可能的(或非常复杂) - 如果有人给我比顶部的代码更好的解决方案,我会很高兴。

+0

对于mvc,你有没有寻找任何特定的框架,如cakephp? – 2012-02-17 04:55:50

+0

您可以尝试在方法内使用func_get_args,然后进行类型检查,或者也可以使用__call魔术函数。 – busypeoples 2012-02-17 05:11:16

+0

什么是你使用的数据库接口?您是否查看过任何现有的PHP DAL或ORM?试图按照与.NET相同的方式进行操作,将无法很好地转化。问题是,你想完成什么以及在PHP中做什么是最好的方法? – deceze 2012-02-17 05:29:39

回答

1

这是一种可能的方法。您也可以使用__call方法来实现此目的。这只是一个简单的例子。要么是这样,要么你可以使用类似推动的ORM来实现类似的事情。这真的取决于任务是什么。

class Row_Builder { 

    protected $default = array(); 

    public function __construct() { 
    $this->default['field_id'] = null; 
    $this->default['field_name'] = null; 
    $this->default['val-string'] = null; 
    $this->default['val-int'] = null; 
    $this->default['val-float'] = null; 
    $this->default['val-image'] = null; 
    $this->default['val-datetime'] = null; 
    $this->default['val-boolean'] = false; 
    return; 
    } 

    public function setValues() { 
    // we only need the fist argument in this case. 
    $params= func_get_arg(0); 
    if(isset($params)) { 
     foreach($params as $key => $value) { 
     if(array_key_exists($key,$this->default)) { 
      $this->default[$key] = $value; 
     } 

     } 
    } 

    } 

    public function __get($key) { 
    if(array_key_exists($key, $this->default)) { 
     return $this->default[$key]; 
    } 
    } 
} 

$row = new Row_Builder; 
$row->setValues(array('field_id' => 1, 'field_name' => 'some value', 'val-string' => 'here is a str value')); 

print $row->field_name; 
+0

看起来这正是我所需要的。谢谢。 如果我明白这一点 - 我可以只设置我需要的值,像这样: $ row-> setValues(array('field_id'=> 1,'field_name'=>'Name')); 数组中的所有字段将可用,其中两个将存储我设置的值。其他字段将填充默认数据。对? – Kamil 2012-02-17 08:00:04

+0

@Kamil默认值是在对象正确启动时设置的。查看__construct函数中的示例。 – busypeoples 2012-02-17 08:05:03