2

我读到了一个神奇的 getter 和 setter 函数,它取代了大量的标准 getter 和 setter。(链接

我更改了 Miles 的功能,因为我正在使用AnnotationForms并且不希望在变量中使用下划线,例如$_name. 我更新了魔术功能,但是当我尝试调用时,getName()我得到:

致命错误:调用未定义的方法... Entity::getName()

这是我的代码:

<?php
namespace Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation as Form;

/**
 * @ORM\Entity
 * @ORM\Table(name="masterdata_entity")
 * @Form\Name("entity")
 * @Form\Attributes({ "class": "form-horizontal" })
 * @Form\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
*/
class Entity
{
  /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   * @ORM\GeneratedValue(strategy="AUTO")
   * @Form\Exclude()
   */
  protected $id;
  /**
   * @ORM\Column(type="string")
   * @Form\Filter({"name":"StringTrim"})
   * @Form\Validator({"name":"StringLength", "options":{"min":1, "max":50}})
   * @Form\Attributes({"type":"text"})
   * @Form\Options({"label":"Name"})
   */
  protected $name;

public function __get($property) {
    return (isset($this->{$property}) ? $this->{$property} : null);
}

public function __set($property, $value) {
    if (isset($this->{$property})) {
        $this->{$property} = $value;
    }
}

public function __isset($property) {
    return isset($this->{$property});
}

}

任何想法为什么会这样以及我如何解决它?

4

1 回答 1

3

我想我的评论是对的。检查DoctrineModule\Stdlib\Hydrator\DoctrineObject,你会发现它基本上使用了\Zend\Stdlib\Hydrator\ClassMethods。看一下extract()-function 你可以看到所有 ClassMethods 都将在第 60 行获取

$methods = get_class_methods($object);

看看第 #63++ 行,你会发现只有默认的 gettergetX, hasX, isX被视为有效:

if (!preg_match('/^(get|has|is)[A-Z]\w*/', $method)) {
    continue;
}

这最终意味着,您将始终必须编写您的 setter 和 getter。即使文件大小可能会变大一点。它对于普通的 IDE 来说更好,而且它也可以提高性能,即使文件大小也是如此。

于 2012-12-27T12:56:29.120 回答