<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://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://jackxiang.com/post//</link>
<title><![CDATA[__get __set魔术引用之我见,以及常用可替代的setParam 方法。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Wed, 03 Mar 2010 10:57:28 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	__get和__set类似于.net中的属性访问器，用于给类中的私有字段赋值。但注意，一般这种方式只能给一个字段赋值，当你的类中有多个字段的时候，建议使用function getProperty()&#123;&#125;和function setProperty(value)的形式（类似于java）。<br/>所以上述代码你使用的方式完全错误：<br/>class Employee<br/>&#123;<br/>$name<br/>public function __get()<br/>&#123;<br/>return $name;//取得私有字段的值<br/>&#125;<br/>public function __set($propValue)<br/>&#123;<br/>this-&gt;$name = $propValue;//给私有字段赋值<br/>&#125;<br/>&#125;<br/><br/>事实上 JAVA等OOP语言中都是将属性设置为private的，其原因就是属性属于对象自身，所以不应该直接通过外界修改（会破坏对象自身的封装），之所以有魔术方法其实是为了通过某种接口来实现特定的属性修改（也就是符合某种条件才能对自身的属性进行修改），事实上对于java来说是采用的手动设置以及获取的方式设置，php中就更为简单了，提供了魔术方法来实现，另外提供__setter和__getter是魔术方法在某些设计模式中也有用到，这可能被设计为动态属性，也就是可以为对象在外部提供属性，而不需要在定义类时定义。<br/><br/>1.不一定是私有属性， ：__get() is utilized for reading data from inaccessible members. <br/>2.可以在__get中增加很多逻辑，有可能你用类中的一个数组类型的变量存了很多值，__get的时候，可以根据数组的key来取值，所以不一定是直接访问某个变量<br/>3.你不设置__get函数的时候，不可访问的变量是受保护的<br/><br/>具体运用：<br/><br/><br/>应该说 getter和setter的作用，最大的原因是为了让变量的修改和获取“可控”<br/><br/>在给属性赋值的时候，通过setter可以先对赋过来的值做一次合法性检查，以避免后面可能出现的错误!<br/>在一个php框架中具体运用，我这人把它从我们的框架中抽离了出来示意一下：<br/><a href="attachment.php?fid=68">点击这里下载文件</a><br/><br/><br/>————————————————用setParam 方法实现代码片段示例———————————————————————<br/><textarea name="code" class="php" rows="15" cols="100">
class Request
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;protected $params = array();//相当于类私有变量


&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Set an action parameter
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * A $value of null will unset the $key if it exists
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param string $key
&nbsp;&nbsp;&nbsp;&nbsp; * @param mixed $value
&nbsp;&nbsp;&nbsp;&nbsp; * @return Request
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public function setParam ($key, $value)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key = (string) $key;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((null === $value) &amp;&amp; isset($this-&gt;params[$key])) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($this-&gt;params[$key]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; elseif (null !== $value) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;params[$key] = $value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Set parameters
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * Set one or more parameters. Parameters are set as userland parameters,
&nbsp;&nbsp;&nbsp;&nbsp; * using the keys specified in the array.
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param array $params
&nbsp;&nbsp;&nbsp;&nbsp; * @return Request
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public function setParams(array $params)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($params as $key =&gt; $value) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setParam($key, $value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
</textarea><br/>getParam方法：<br/><textarea name="code" class="php" rows="15" cols="100">
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves a value from the route parameters.
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; string&nbsp;&nbsp; key of the value
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; mixed&nbsp;&nbsp;&nbsp;&nbsp;default value if the key is not set
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp;&nbsp;mixed
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public function getParam ($key, $default = NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isset($this-&gt;params[$key])) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Security::xss_clean($this-&gt;params[$key]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; elseif (isset($_GET[$key])) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Security::xss_clean($_GET[$key]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; elseif (isset($_POST[$key])) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Security::xss_clean($_POST[$key]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $default;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
</textarea><br/>————————————————用__set和__get方法—————————————————<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
class TMController
&#123;

&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Set values
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * In order to follow &#123;@link __get()&#125;, which operates on a number of
&nbsp;&nbsp;&nbsp;&nbsp; * superglobals, setting values through overloading is not allowed and will
&nbsp;&nbsp;&nbsp;&nbsp; * raise an exception. Use setParam() instead.
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param string $key
&nbsp;&nbsp;&nbsp;&nbsp; * @param mixed $value
&nbsp;&nbsp;&nbsp;&nbsp; * @return void
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public function __set ($key, $value)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//throw new Exception(&#039;Setting values in superglobals not allowed; please use setParam()&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;abc[$key]=$value;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Alias to __set()
&nbsp;&nbsp;&nbsp;&nbsp; *
&nbsp;&nbsp;&nbsp;&nbsp; * @param string $key
&nbsp;&nbsp;&nbsp;&nbsp; * @param mixed $value
&nbsp;&nbsp;&nbsp;&nbsp; * @return void
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;public function set ($key, $value)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;__set($key, $value);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;function ab()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result = &quot;ab&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;weekscore = $result;
&nbsp;&nbsp;&#125;

&#125;

class scoreController extends TMController
&#123;
&nbsp;&nbsp;function abc()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result = &quot;abc&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;weekscore = $result;
&nbsp;&nbsp;&#125;
&#125;

$a = new TMController();
$a-&gt;ab();
print_r($a);

$a = new scoreController();
$a-&gt;abc();
print_r($a);

</textarea><br/><br/>Result:<br/>---------- 调试PHP ----------<br/>TMController Object<br/>(<br/>&nbsp;&nbsp;&nbsp;&nbsp;[abc] =&gt; Array<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[weekscore] =&gt; ab<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br/><br/>)<br/>scoreController Object<br/>(<br/>&nbsp;&nbsp;&nbsp;&nbsp;[abc] =&gt; Array<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[weekscore] =&gt; abc<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br/><br/>)<br/><br/>输出完成 (耗时 0 秒) - 正常终止
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] __get __set魔术引用之我见,以及常用可替代的setParam 方法。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>