I'm just not satisfied with the limitations that PHP has when it comes to implicit accessor methods.
blockquote>
blockquote>
blockquote>
我完全同意。我喜欢Python的处理方式(我的实现只是它的笨拙翻版)。
是的,必须手动声明变量,但是我发现它更好,因为我担心设置器中的错字
1
| $props2->setFristName('Mark'); |
将自动生成一个新属性(用FristName代替FirstName),这将使调试更加困难。
@马克
但是,即使您的方法也需要对方法进行全新的声明,并且它在某种程度上也消除了将其放入方法中的优势,以便您可以添加更多的逻辑,因为要添加更多的逻辑,则需要使用老式的方法声明, 反正。在默认状态下(这在检测/执行方面令人印象深刻),您的技术(在PHP中)没有提供超过公共字段的优势。您正在限制对该字段的访问,但是通过本身没有任何限制的访问器方法来实现空白。我不知道未经检查的显式访问器在任何语言上都比公共领域具有任何优势,但是如果我错了,人们可以并且应该随时纠正我。
我也喜欢拥有一些方法,而不仅仅是使用公共字段,但是我的PHP默认实现(使用__get()和__set())或您的自定义实现的问题是,您没有在每个属性的基础。我的问题是,添加"以后更多逻辑"要求您添加覆盖逻辑,该逻辑适用于使用getter / setter访问的所有属性,或者使用if或switch语句评估要访问的属性,以便您可以应用特定逻辑。
我喜欢您的解决方案,为此我为您称赞-我只是不满意PHP在隐式访问器方法方面的局限性。
我不禁投入2美分...
我已经习惯在此庄园中使用__get和__set http://gist.github.com/351387(类似于教义的用法),然后只能通过在类之外。这样,您可以根据需要覆盖功能,而不必创建巨大的__get或__set函数,或者在子类中覆盖__get和__set。
就在最近,我还考虑过按照建议的方式处理getter和setter方法(第二种方法是我的最爱,即私有的$ props数组),但是我将其丢弃了,因为它在我的应用程序中无法解决。
我正在一个基于SoapServer的大型应用程序上工作,PHP 5的soap接口将通过soap传输的值直接注入到关联的类中,而不必担心该类中现有或不存在的属性。 >
我一直通过类似__call的方式来处理此问题,在很多类中,它最终都与样板代码一样。但是,它很紧凑,并且使用反射类仅为已设置的属性添加getters / setter方法(不会添加新属性)。只需显式添加getter / setter即可添加更复杂的功能。预期为
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| /**
* Handles default set and get calls
*/
public function __call($method, $params) {
//did you call get or set
if ( preg_match("|^[gs]et([A-Z][\\w]+)|", $method, $matches ) ) {
//which var?
$var = strtolower($matches[1]);
$r = new ReflectionClass($this);
$properties = $r->getdefaultProperties();
//if it exists
if ( array_key_exists($var,$properties) ) {
//set
if ( 's' == $method[0] ) {
$this->$var = $params[0];
}
//get
elseif ( 'g' == $method[0] ) {
return $this->$var;
}
}
}
} |
将此内容添加到已声明默认属性的类中,例如:
1 2 3 4 5 6 7 8
| class MyClass {
public $myvar = null;
}
$test = new MyClass;
$test->setMyvar ="arapaho";
echo $test->getMyvar; //echos arapaho |
反射类可能会在您的建议中增加一些用处。整洁的解决方案@Mark。