Why Isn't #value valid for 'textfield' form types in Drupal 7?
Form API is an abstraction over regular HTML form elements, so there are cases where attributes don't match up exactly.

In the context of Form API, #value is for values you don't want the user changing, and doesn't make sense with respect to text &lt;input&gt; controls.

Instead, you want to use #default_value, which is for values you do want the user to change. That is:

$form['mytextfield'] = array(
   'type' =&gt; 'textfield',
   '#default_value' =&gt; 'Foo',
);


is the same as:

&lt;input type="text" value="Foo" /&gt;


If you want to mimic the behavior of Form API's #value (i.e. provide a default value and prevent the user from changing it), use the #disabled property:

$form['mytextfield'] = array(
   'type' =&gt; 'textfield',
   '#default_value' =&gt; 'Foo',
   '#disabled' =&gt; TRUE,
);


For more information about the internals, check out form_builder(), which constructs the render array for the form and _form_builder_handle_input_element(), which replaces #value with the value of #default_value prior to rendering.