【问题标题】:PHP - simplyfy the code - something like MVC partPHP - 简化代码 - 类似于 MVC 部分
【发布时间】:2012-02-17 04:45:02
【问题描述】:

我是 .NET 程序员,但对 PHP 来说是全新的。我与这个斗争了几个小时。

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

    $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 中是不可能的(或非常复杂的)——如果有人给我比顶部的代码更好的解决方案,我会很高兴。

【问题讨论】:

  • 对于mvc,您是否寻找任何特定的框架,例如cakephp?
  • 您可以尝试在方法中使用 func_get_args 然后进行类型检查,或者您也可以使用 __call 魔术函数。
  • 您使用的数据库接口是什么?您是否查看过任何现有的 PHP DAL 或 ORM?尝试以与在 .NET 中相同的方式进行操作不会很好地翻译。问题是,你想完成什么?在 PHP 中最好的方法是什么?

标签: php arrays dynamic properties overloading


【解决方案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;

【讨论】:

  • 看起来这正是我所需要的。谢谢你。如果我理解这一点 - 我只能设置我需要的值,如下所示: $row->setValues(array('field_id' => 1, 'field_name' => 'Name'));数组中的所有字段都将可用,其中两个将存储我设置的值。其他字段将填充默认数据。对吗?
  • @Kamil 默认值是在对象完全启动时设置的。请参阅 __construct 函数中的示例。
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多