【问题标题】:Form inputs to class properties类属性的表单输入
【发布时间】:2014-01-11 14:41:30
【问题描述】:

我正在尝试学习 OO PHP,并且正在从事内容管理器项目,我想从 html 表单开始构造一个对象。

例如,如果我有一个包含十个文本框(或其他类型的输入)的表单,我以 POST 模式发送表单,然后我想从 POST 数据开始构造我的对象。

我必须将它们作为构造函数的参数传递,还是作为数组传递?怎么样?

只是一个例子:

我的小表格:姓名、姓氏、描述(但可能有十多个输入)

我的 $_POST 数组:('name'=>'Mario', 'surname'=>'Rossi', 'description'=>'这里只是一个描述。')

我的班级:

class Person {
    private $name;
    private $surname;
    private $description;

    public function __contruct(/*arguments or array here*/) {
    }
}

【问题讨论】:

    标签: php forms class oop constructor


    【解决方案1】:

    一个干净简单的解决方案是使用json_decode 和json_encode 函数。

    http://php.net/json_decode

    $object = json_decode(json_encode($_POST['formdata']), FALSE);
    

    json_decode 将您的表单数据转换为序列化对象,json_encode (false) 的第二个参数可防止将数据转换回array。

    【讨论】:

    • 这对作为对象的转换有什么好处? codepad.org/d5OsitKp - 输出没有区别,但是 json 函数比较慢。
    • 不,它是递归的。仅转换为对象只会将第一级转换为对象。 json_encode/decode 也适用于子数组。
    • 在关联数组上是的,但提问者没有提到这是他们想要的。问题只是将$_POST 转换为对象,而不是子对象。
    • Associative:当然,因为数据来自 html 表单。多维:大概,想想name="id[]" value="1"等等。
    【解决方案2】:

    不要在函数中直接使用$_POST,而是将其作为参数发送给函数

    来自 CLASS 对象的函数调用:

    $args = array(
       'val1' => $_POST['val1'],
       'val2' => $_POST['val2'],
       'val3' => $_POST['val3']
    );
    $obj->funct($args);
    

    类中的函数定义:

    public function funct ($param = array()) {
       print_r( $param );
    }
    

    【讨论】:

    • public function funct () { print_r($_POST); } 有什么问题
    • 只是一个建议,使用$_POST 没有任何问题。但是,如果您将它们作为参数发送,将来的更改会很容易..
    • @TheEscapist 编辑您的问题并添加,作为评论阅读太难了..
    • @zzlalani 好的,但是如果我有很多输入,那么将它们全部作为构造函数的参数发送是很疯狂的。我可能会将它们作为数组发送,但如果我直接发送 $_POST 可能会有其他外部元素,如果我发送正确的数组,我应该使用其他代码行从 $_POST 创建它。有什么更好的解决方案?
    • @zzlalani 好的,所以我必须创建我的数组并将其作为参数传递。
    【解决方案3】:

    如果您的表单有超过一个Person 的数据,那么一个Person 不足以代表您的表单!

    有一个类PersonForm(或任何可能的名称),并将$_POST 数组作为参数传入。

    然后PersonForm 可以使用数组中的一些数据创建(通过new 或使用PersonFactory 类)Person 对象。

    【讨论】:

      猜你喜欢
      • 2019-07-16
      • 2015-01-15
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2011-10-07
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多