Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to unset/remove a protected property

Tags:

php

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?

like image 694
adit Avatar asked Dec 20 '22 04:12

adit


2 Answers

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);
  }
like image 75
Orangepill Avatar answered Dec 30 '22 05:12

Orangepill


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);
like image 38
alexwenzel Avatar answered Dec 30 '22 05:12

alexwenzel