<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[简单技巧]阅读了下MVC框架渲染html的了部分代码，觉得用PHP extract() 函数可能更加好一些:PHP中extract()函数的妙用。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Thu, 11 Mar 2010 03:47:41 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	拜读了一下：TMView**.class.php里面的：<br/><br/><div class="code">&nbsp;&nbsp;&nbsp;&nbsp;<br/>foreach($vars as $key =&gt; $value)<br/>&#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp; $$key=$value;&nbsp;&nbsp;&nbsp;&nbsp; //借尸还魂的运用：把controller层的塞入的变量又给还原回来<br/>&#125;<br/></div><br/><br/>其实可以改写为一行：<br/><br/><div class="code">extract($vars);</div><br/><br/><br/>特别的地方，其实这个函数还考虑到了防止变量覆盖问题，可以有参数的喔：<br/><br/><br/><div class="code">&lt;?php<br/>$a = &#039;Original&#039;;<br/>$my_array = array(&quot;a&quot; =&gt; &quot;Cat&quot;,&quot;b&quot; =&gt; &quot;Dog&quot;, &quot;c&quot; =&gt; &quot;Horse&quot;);<br/><br/>extract($my_array, EXTR_PREFIX_SAME, &#039;dup&#039;);<br/><br/>echo &quot;&#92;$a = $a; &#92;$b = $b; &#92;$c = $c; &#92;$dup_a = $dup_a;&quot;;<br/>?&gt;</div><br/><br/>$a就没有被覆盖，同时可以通过函数第3个参数:dup，配合_a: $dup_a=cat了，有规律可循，操作更加灵活！<br/>输出：<br/><br/><div class="code">$a = Original; $b = Dog; $c = Horse; $dup_a = Cat;</div><br/><br/><br/><br/>compact() 它做的事和 extract() 正好相反。返回将所有变量添加进去后的数组。 <br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?php
$city&nbsp;&nbsp;= &quot;San Francisco&quot;;
$state = &quot;CA&quot;;
$event = &quot;SIGGRAPH&quot;;

$location_vars = array(&quot;city&quot;, &quot;state&quot;);

$result = compact(&quot;event&quot;, &quot;nothing_here&quot;, $location_vars);
?&gt; 
</textarea><br/>结果，经过处理后，$result 为： <br/><textarea name="code" class="html" rows="15" cols="100">
Array
(
&nbsp;&nbsp;&nbsp;&nbsp;[event] =&gt; SIGGRAPH
&nbsp;&nbsp;&nbsp;&nbsp;[city] =&gt; San Francisco
&nbsp;&nbsp;&nbsp;&nbsp;[state] =&gt; CA
)
</textarea><br/><br/>——————————————————————————————————————————————————————————<br/>PHP中extract()函数的妙用<br/>背景：在看一哥们写代码时，发现多了一个data变量，通过zend编辑器看这变量一直没找到，原来是<br/>&nbsp;&nbsp; 早些时候在看一框架关于POST的代码时，看到一个非常好用的函数：extract()，<br/>它的主要作用是将数组展开，键名作为变量名，元素值为变量值，<br/>可以说为数组的操作提供了另外一个方便的工具，<br/>比方说，可以很方便的提取$_POST或者$_GET的元素，对表单提交上来的内容不能不用一一赋值，直接使用下面代码：<br/>form.html<br/><textarea name="code" class="html" rows="15" cols="100">
&lt;form action=&quot;action.php&quot; method=&quot;post&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;username&quot;&gt;
&lt;input type=&quot;password&quot; name=&quot;password&quot;&gt;
&lt;input type=&quot;submit&quot;&gt;
</textarea><br/>在action.php中只要使用extract()函数将$_POST全局数据解开：<br/>action.php<br/><textarea name="code" class="php" rows="15" cols="100">
 &lt;?php
extract($_POST);
//相当于$username = $_POST[&#039;username&#039;];
//$password = $_POST[&#039;password&#039;];
?&gt;
</textarea><br/>是不是很方便呢？呵呵，下面是PHP手册里的详细解释：<br/>extract<br/>(PHP 4, PHP 5)<br/>extract — 从数组中将变量导入到当前的符号表<br/>说明<br/>int extract ( array $var_array [, int $extract_type [, string $prefix ]] )<br/>本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名，值作为变量的值。对每个键／值对都会在当前的符号表中建立变量，并受到 extract_type 和 prefix 参数的影响。<br/>Note: 自版本 4.0.5 起本函数返回被提取的变量数目。<br/>Note: EXTR_IF_EXISTS 和 EXTR_PREFIX_IF_EXISTS 是版本 4.2.0 中引进的。<br/>Note: EXTR_REFS 是版本 4.3.0 中引进的。<br/>extract() 检查每个键名看是否可以作为一个合法的变量名，同时也检查和符号表中已有的变量名的冲突。对待非法／数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一：<br/>EXTR_OVERWRITE<br/>如果有冲突，覆盖已有的变量。<br/>EXTR_SKIP<br/>如果有冲突，不覆盖已有的变量。<br/>EXTR_PREFIX_SAME<br/>如果有冲突，在变量名前加上前缀 prefix 。<br/>EXTR_PREFIX_ALL<br/>给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。<br/>EXTR_PREFIX_INVALID<br/>仅在非法／数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。<br/>EXTR_IF_EXISTS<br/>仅在当前符号表中已有同名变量时，覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量，然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。<br/>EXTR_PREFIX_IF_EXISTS<br/>仅在当前符号表中已有同名变量时，建立附加了前缀的变量名，其它的都不处理。本标记是 PHP 4.2.0 新加的。<br/>EXTR_REFS<br/>将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。<br/>如果没有指定 extract_type ，则被假定为 EXTR_OVERWRITE。<br/>注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME，EXTR_PREFIX_ALL，EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名，将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。<br/>extract() 返回成功导入到符号表中的变量数目。<br/>Warning<br/>不要对不能信任的数据使用 extract()，例如用户的输入（$_GET，…）。如果这样做，举例说，要临时运行依赖于 register_globals 的老代码，要确保使用不会覆盖的 extract_type 值，例如 EXTR_SKIP，并且要留意应该按照 php.ini 中由 variables_order 定义的顺序来提取。<br/>extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。<br/>Example#1 extract() 例子<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
/* 假定 $var_array 是 wddx_deserialize 返回的数组*/
$size = &quot;large&quot;;
$var_array = array(&quot;color&quot; =&gt; &quot;blue&quot;,
&quot;size&quot;&nbsp;&nbsp;=&gt; &quot;medium&quot;,
&quot;shape&quot; =&gt; &quot;sphere&quot;);
extract($var_array, EXTR_PREFIX_SAME, &quot;wddx&quot;);
echo &quot;$color, $size, $shape, $wddx_size&#92;n&quot;;
?&gt;
</textarea><br/>$size 没有被覆盖，因为指定了 EXTR_PREFIX_SAME，这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP，则 $wddx_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”，EXTR_PREFIX_ALL 将建立新变量 $wddx_color，$wddx_size 和 $wddx_shape。<br/>必须使用关联数组，数字索引的数组将不会产生结果，除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。<br/>来自：http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0723/3090.html<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [简单技巧]阅读了下MVC框架渲染html的了部分代码，觉得用PHP extract() 函数可能更加好一些:PHP中extract()函数的妙用。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>