PHP自动化设置器和获取器

10

我想要实现一些自动化的getter和setter方法,用于php对象。

我的目标是为每个属性自动生成getProperty()setProperty(value)方法。这样,如果某个属性的方法没有被实现,脚本就会简单地获取或设置该值。

举个例子,为了让自己更清晰明了:

class Foo {
    public $Bar;
}

$A = new A();
$A->setBar("bar");
$A->getBar(); // -> output "bar"

或者

class Foo {
    public $Bar;
    public function setBar($bar) { $Bar = $bar; }
    public function getBar($bar) { return 'the value is: ' . $bar; }
}

$A = new A();
$A->setBar("bar");
$A->getBar(); // -> output "the value is: bar"

有关如何完成此任务的任何想法/提示?

只是一个领域的尝试:你可以解析文档并为每个找到的属性编写设置器和获取器,同时使用输出写入器。我进一步建议寻找已经可以做到这一点的框架。<离题>其他平台甚至可以通过自动持久化来实现(例如Java平台的Grails)</离题> - 最白目
2个回答

27

如果您想模拟任意属性的getXysetXy函数,则可以使用神奇的__call包装器:

function __call($method, $params) {

     $var = lcfirst(substr($method, 3));

     if (strncasecmp($method, "get", 3) === 0) {
         return $this->$var;
     }
     if (strncasecmp($method, "set", 3) === 0) {
         $this->$var = $params[0];
     }
}

这将是一个很好的机会,通过添加 typemap 或其他内容来做一些有用的事情。否则完全避免使用 getter 和 setter 可能是明智的选择。


1
一些修复: strncasecmp($method, "set", 3) === 0 // 对于prev也是同样的事情 以及 $var = lcfirst(substr($method, 3)); // 比如驼峰命名 - th3n3rd
@th3n3rd,你的链接已经失效了。 - tvanc
@turibe,我没有发布任何链接,我不确定你指的是什么。 - th3n3rd
@th3n3rd 那个评论是针对我的/答案的(并且链接已经修复:internat-archive等)。 - mario

3

阅读 PHP 的魔术函数,您可以使用 __get 和 __set 函数。

点击此链接了解更多信息。


那不是我需要的。我需要另一种方法。当属性本身不存在时,使用__get__set - sebataz
2
他确实告诉过你要阅读有关魔术函数的内容。查看__call魔术函数的作用。 - N.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接