I have a Product object/class as follows:
class Product
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @Exclude()
* @ORM\Column(name="deletedAt", type="datetime", nullable=true)
*/
private $deletedAt;
/**
* @Assert\NotBlank()
* @Assert\MinLength( limit=3, message=" Product Name should have at least {{ limit }} characters.")
* @ORM\Column(name="name", type="string", length=100 , nullable=false)
*/
protected $name;
/**
* @var datetime $created
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
*/
private $created;
/**
* @var datetime $updated
* @Gedmo\Timestampable(on="update")
* @ORM\Column(type="datetime")
*/
private $updated;
/**
* @ORM\Column(name="description", type="string", length=350)
*/
protected $description;
/**
* @Assert\NotBlank()
* @ORM\Column(name="code", type="string", length=100)
*/
protected $code;
/**
* @Assert\NotBlank()
* @ORM\ManyToOne(targetEntity="Shopious\MainBundle\Entity\Category", inversedBy="products")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE", nullable=true)
*/
protected $category;
/**
* @Assert\NotBlank()
* @Assert\Min(limit = "0", message = "negative number is invalid")
* @Assert\Type(type="float", message="The value {{ value }} is not a valid number.")
* @ORM\Column(name="price", type="float")
*/
protected $price;
/**
* @Assert\NotBlank()
* @Assert\Min(limit = "0", message = "negative number is invalid")
* @Assert\Type(type="float", message="The value {{ value }} is not a valid number.")
* @ORM\Column(name="height", type="float")
*/
protected $height;
/**
* @Assert\NotBlank()
* @Assert\Min(limit = "0", message = "negative number is invalid")
* @Assert\Type(type="float", message="The value {{ value }} is not a valid number.")
* @ORM\Column(name="width", type="float")
*/
protected $width;
/**
* @Assert\NotBlank()
* @Assert\Min(limit = "0", message = "negative number is invalid")
* @Assert\Type(type="float", message="The value {{ value }} is not a valid number.")
* @ORM\Column(name="length", type="float")
*/
protected $length;
/**
* @Assert\NotBlank()
* @Assert\Min(limit = "0", message = "negative number is invalid")
* @Assert\Type(type="float", message="The value {{ value }} is not a valid number.")
* @ORM\Column(name="weight", type="float" )
*/
protected $weight;
/**
* @Accessor(getter="getShopRef")
* @ORM\ManyToOne(targetEntity="Shopious\MainBundle\Entity\Shop", inversedBy="products")
* @ORM\JoinColumn(name="shop_id", referencedColumnName="id", onDelete="CASCADE" , nullable=false)
*/
protected $shop;
/**
* @ORM\OneToMany(targetEntity="ProductAttribute", mappedBy="product", cascade={"persist","remove"})
*/
protected $attributes;
}
and so I have a Product object and I wanted to remove all the attributes of that product, so I did:
unset(product->attributes)
however it complained that the attributes can't be accessed. How is it possible to set the attributes of the Product to be nil?
By definition a protected property can only be accessed from within an instance of the class it is defined in or a descendant.
This is why one would opt choose to make a property protected vs. public, to make it unavailable for changing outside of instances of the class.
To unset it would have to be done from within the class i.e.
public function removeAttributes(){
unset($this->attributes);
}
Your could use reflection to set a private/protected property to null
.
http://php.net/manual/en/reflectionproperty.setvalue.php
class Foo {
public static $staticProperty;
public $property;
protected $privateProperty;
}
$reflectionClass = new ReflectionClass('Foo');
$reflectionProperty = $reflectionClass->getProperty('privateProperty');
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue($foo, null);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With