Skip to content

Instantly share code, notes, and snippets.

@turboezh
Created January 19, 2016 13:55
Show Gist options
  • Select an option

  • Save turboezh/a42322c254bf61fca966 to your computer and use it in GitHub Desktop.

Select an option

Save turboezh/a42322c254bf61fca966 to your computer and use it in GitHub Desktop.

Revisions

  1. turboezh created this gist Jan 19, 2016.
    126 changes: 126 additions & 0 deletions MagicPropertiesTrait.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,126 @@
    <?php


    namespace app\helpers;


    use yii\base\InvalidCallException;
    use yii\base\UnknownPropertyException;


    trait MagicPropertiesTrait
    {
    /**
    * Returns the value of a property.
    * This method will check in the following order and act accordingly:
    *
    * - a property defined by a getter: return the getter result
    *
    * Do not call this method directly as it is a PHP magic method that
    * will be implicitly called when executing `$value = $component->property;`.
    *
    * @param string $name the property name
    *
    * @return mixed the property value or the value of a behavior's property
    * @throws UnknownPropertyException if the property is not defined
    * @throws InvalidCallException if the property is write-only.
    * @see __set()
    */
    public function __get($name)
    {
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
    // read property, e.g. getName()
    return $this->$getter();
    }

    if (method_exists($this, 'set' . $name)) {
    throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    } else {
    throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
    }
    }

    /**
    * Sets the value of a property.
    * This method will check in the following order and act accordingly:
    *
    * - a property defined by a setter: set the property value
    *
    * Do not call this method directly as it is a PHP magic method that
    * will be implicitly called when executing `$component->property = $value;`.
    *
    * @param string $name the property name or the event name
    * @param mixed $value the property value
    *
    * @throws UnknownPropertyException if the property is not defined
    * @throws InvalidCallException if the property is read-only.
    * @see __get()
    */
    public function __set($name, $value)
    {
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
    // set property
    $this->$setter($value);

    return;
    }

    if (method_exists($this, 'get' . $name)) {
    throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    } else {
    throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
    }
    }

    /**
    * Checks if a property is set, i.e. defined and not null.
    * This method will check in the following order and act accordingly:
    *
    * - a property defined by a setter: return whether the property is set
    * - return `false` for non existing properties
    *
    * Do not call this method directly as it is a PHP magic method that
    * will be implicitly called when executing `isset($component->property)`.
    *
    * @param string $name the property name or the event name
    *
    * @return boolean whether the named property is set
    * @see http://php.net/manual/en/function.isset.php
    */
    public function __isset($name)
    {
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
    return $this->$getter() !== null;
    }

    return false;
    }

    /**
    * Sets a component property to be null.
    * This method will check in the following order and act accordingly:
    *
    * - a property defined by a setter: set the property value to be null
    *
    * Do not call this method directly as it is a PHP magic method that
    * will be implicitly called when executing `unset($component->property)`.
    *
    * @param string $name the property name
    *
    * @throws InvalidCallException if the property is read only.
    * @see http://php.net/manual/en/function.unset.php
    */
    public function __unset($name)
    {
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
    $this->$setter(null);
    return;
    }

    throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
    }
    }