Пример #1
0
 /**
  * @param string $identifier
  * @return bool
  * @internal
  */
 public function offsetExists($identifier)
 {
     if ($this->getElementValue($identifier) !== null) {
         return true;
     }
     if (is_callable([$this, 'get' . ucfirst($identifier)])) {
         return true;
     }
     if (is_callable([$this, 'has' . ucfirst($identifier)])) {
         return true;
     }
     if (is_callable([$this, 'is' . ucfirst($identifier)])) {
         return true;
     }
     if (property_exists($this, $identifier)) {
         $propertyReflection = new PropertyReflection($this, $identifier);
         return $propertyReflection->isPublic();
     }
     return false;
 }
Пример #2
0
 /**
  * Set a property for a given object.
  * Tries to set the property the following ways:
  * - if target is an array, set value
  * - if super cow powers should be used, set value through reflection
  * - if public setter method exists, call it.
  * - if public property exists, set it directly.
  * - if the target object is an instance of ArrayAccess, it sets the property
  * on it without checking if it existed.
  * - else, return FALSE
  *
  * @param mixed &$subject The target object or array
  * @param string $propertyName Name of the property to set
  * @param mixed $propertyValue Value of the property
  * @param bool $forceDirectAccess directly access property using reflection(!)
  *
  * @throws \InvalidArgumentException in case $object was not an object or $propertyName was not a string
  * @return bool TRUE if the property could be set, FALSE otherwise
  */
 public static function setProperty(&$subject, $propertyName, $propertyValue, $forceDirectAccess = false)
 {
     if (is_array($subject)) {
         $subject[$propertyName] = $propertyValue;
         return true;
     }
     if (!is_object($subject)) {
         throw new \InvalidArgumentException('subject must be an object or array, ' . gettype($subject) . ' given.', 1237301368);
     }
     if (!is_string($propertyName)) {
         throw new \InvalidArgumentException('Given property name is not of type string.', 1231178878);
     }
     if ($forceDirectAccess === true) {
         if (property_exists(get_class($subject), $propertyName)) {
             $propertyReflection = new PropertyReflection(get_class($subject), $propertyName);
             $propertyReflection->setAccessible(true);
             $propertyReflection->setValue($subject, $propertyValue);
         } else {
             $subject->{$propertyName} = $propertyValue;
         }
     } elseif (is_callable(array($subject, $setterMethodName = self::buildSetterMethodName($propertyName)))) {
         $subject->{$setterMethodName}($propertyValue);
     } elseif ($subject instanceof \ArrayAccess) {
         $subject[$propertyName] = $propertyValue;
     } elseif (array_key_exists($propertyName, get_object_vars($subject))) {
         $subject->{$propertyName} = $propertyValue;
     } else {
         return false;
     }
     return true;
 }