我读到了一个神奇的getter和setter函数,它取代了巨大的标准getter和setter。 (Link)
我改变了Miles的功能,因为我使用AnnotationForms
并且不想在$_name
之类的变量中使用下划线。我更新了魔术功能,但在尝试呼叫时,例如getName()
我明白了:
致命错误:调用未定义的方法......实体:: 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});
}
}
为什么会这样,以及如何解决它?
答案 0 :(得分:3)
我猜我的评论是正确的。检查DoctrineModule\Stdlib\Hydrator\DoctrineObject,您会看到它基本上使用\Zend\Stdlib\Hydrator\ClassMethods。看一下extract()
- 函数,您可以看到所有ClassMethod都将在line #60
$methods = get_class_methods($object);
看一下line #63++,您会看到只有默认的getter getX, hasX, isX
被视为有效:
if (!preg_match('/^(get|has|is)[A-Z]\w*/', $method)) {
continue;
}
这最终意味着,您将始终必须编写您的setter和getter。即使文件大小可能会变得更大。对于通常的IDE来说它更好,即使文件化也是如此,它也是性能提升。