Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP面向对象表单生成器_Php_Oop_Design Patterns - Fatal编程技术网

PHP面向对象表单生成器

PHP面向对象表单生成器,php,oop,design-patterns,Php,Oop,Design Patterns,我正在尝试创建一个面向对象的表单生成器。请记住,我们公司只有少数人会使用它来解决特定问题 我目前面临两个小警告 创建元素的语法 我可以采取的方法很少 在构造函数中设置所有内容。作为一个缺点,这可能会导致不恰当的构造函数使用 Input::create('text', 'name', array('maxlength' => 10)); 将构造函数限制为仅键入和公开最常用的属性作为方法(保留一个方法用于质量属性设置) 通过为每个属性创建方法或使用\u callmagic方法将每个属性公开为

我正在尝试创建一个面向对象的表单生成器。请记住,我们公司只有少数人会使用它来解决特定问题

我目前面临两个小警告

创建元素的语法

我可以采取的方法很少

在构造函数中设置所有内容。作为一个缺点,这可能会导致不恰当的构造函数使用

Input::create('text', 'name', array('maxlength' => 10));
将构造函数限制为仅键入和公开最常用的属性作为方法(保留一个方法用于质量属性设置)

通过为每个属性创建方法或使用
\u call
magic方法将每个属性公开为方法,这将导致IDE中不支持自动完成。即使现在,我仍然可以保留
属性
方法

Input::create()->type('text')->name('name')->value('value')->max_length(10)->id('id'); //etc.
目前,我认为第二种方法是最好的,因为它把“好”的东西从两个世界中保留下来。As仍然提供了一种抽象某些工作的方法,因为例如,方法
required
不仅会设置required属性,而且还会根据需要将此字段标记为validation object

方法2和方法3的代码复制

因为有一些属性可以由每个元素使用,但也有一些属性只能由3个或4个元素使用,例如HTML5属性
表单

每个元素都可以从基本元素继承,基本元素具有对每个元素通用的属性的方法(例如,
name
)。部分可用的属性可以通过接口解决,但这会导致代码重复,因为它们不能包含方法体

Traits将是解决方案,但遗憾的是,我被PHP5.3困住了,无法升级。这让我要么实现Mixin,要么实现Composition模式,这同样可能导致不支持自动完成。当使用第二种方法时,这将部分缓解

所以我的实际问题是:

哪种方法最合适?(适用于最小的代码重复、可靠的代码重用和易于实现)


我意识到这很可能会产生基于意见的答案,所以如果是这样,我提前道歉。

我会选择第二种选择。可能是因为它让我想起了jQuery

Input::create('text')->name('name')->value('value')->attribute('max_length', 10);
在接口类“FormElements”中定义更通用的字段,如“name”、“value”、“attribute”,并在类“Input”、“Select”等中实现/扩展该字段


虽然我个人更喜欢第二种选择。。用外星人保罗的话说,“有时候你得掷骰子。”

我意识到这是一个老问题,但评论中有人提到我创建的一个项目,名为。我最近发布了一个新的版本2.x,它使HTML生成在PHP中变得非常愉快,我在这里加入了一些支持

use function htmlgen\html as h;
echo h('input', ['name'=>'catQty', 'value'=>500])
将呈现

<input name="catQty" value="500">
这是输出(实际输出没有空格)

将输出(同样,空白仅用于显示)


它完全是100%的PHP,没有定制的、专有的有趣的业务。它极具表现力,适合创作伟大的作品。您可以将模板分解为易于重用的函数或
require
调用


查看更酷的提示

Is
Input::create()
只是一种用于创建真正“输入对象”的工厂方法吗?我很困惑,因为你几次提到一个构造函数,但从未展示过你的构造函数。对于继承问题,还有一些抽象类。它们可以有一个方法体,也可以通过定义没有方法体的抽象方法将实现细节委托给它们的子对象。Input::create()创建一个独立的输入对象,但多个元素(例如Textarea和Button)将具有不同的构造函数参数。正如我所说的,每个元素都可以从基本元素(抽象类)继承,但我们讨论的是单一继承,因此在使用多个基本元素时会出现代码重复(因为我不希望属性只能设置为textarea中的输入)。在接口中使用多个基本元素也会导致重复。是否考虑过查看已经存在的内容?我需要解决一个特定的使用情况,在这种情况下,我会花更多的时间更新现有内容,而不是创建它。我不确定在HTML表单的元素是预定义的情况下,是否会有大量重复的代码。在我的表单生成器中,我有以下继承:BaseField->TextField->EmailField;基本字段->按钮->提交按钮等。也许这个办法合适?
<input name="catQty" value="500">
h('#wrapper',
  h('h1.title', 'Hello, World'),
  h('p',
    h('comment', 'link to project'),
    h('a', ['href'=>'https://github.com/naomik/htmlgen'], 'See htmlgen on Github')
  )
);
<div id="wrapper">
  <h1 class="title">Hello, World</h1>
  <p>
    <!-- link to project -->
    <a href="https://github.com/naomik/htmlgen">See htmlgen on Github</a>
  </p>
</div>
use function htmlgen\html as h;
use function htmlgen\map;

$links = [
  'home' => '/',
  'cats' => '/cats',
  'milk' => '/milk',
  'honey' => '/honey',
  'donuts' => '/donuts',
  'bees' => '/bees'
];

echo h('nav',
  h('ul',
    map($links, function($href, $text) { return
      h('li',
        h('a', ['href'=>$href], $text)
      );
    })
  )
);
<nav>
  <ul>
    <li><a href="/">home</a></li>
    <li><a href="/cats">cats</a></li>
    <li><a href="/milk">milk</a></li>
    <li><a href="/honey">honey</a></li>
    <li><a href="/donuts">donuts</a></li>
    <li><a href="/bees">bees</a></li>
  </ul>
</nav>