151 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur;
 | |
| 
 | |
| use ReflectionClass;
 | |
| use ReflectionException;
 | |
| 
 | |
| /**
 | |
|  * Class oprop: des outils pour accéder aux propriétés d'un objet
 | |
|  *
 | |
|  * @see valx
 | |
|  */
 | |
| class oprop {
 | |
|   /** obtenir la valeur d'une propriété */
 | |
|   static final function get(object $object, string $property, $default=null) {
 | |
|     $c = new ReflectionClass($object);
 | |
|     try {
 | |
|       $p = $c->getProperty($property);
 | |
|       $p->setAccessible(true);
 | |
|       return $p->getValue($object);
 | |
|     } catch (ReflectionException $e) {
 | |
|       if (property_exists($object, $property)) return $object->$property;
 | |
|       else return $default;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   static final function _set(ReflectionClass $c, object $object, string $property, $value) {
 | |
|     try {
 | |
|       $p = $c->getProperty($property);
 | |
|       $p->setAccessible(true);
 | |
|       $p->setValue($object, $value);
 | |
|     } catch (ReflectionException $e) {
 | |
|       $object->$property = $value;
 | |
|     }
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   /** spécifier la valeur d'une propriété */
 | |
|   static final function set(object $object, string $property, $value) {
 | |
|     $c = new ReflectionClass($object);
 | |
|     return self::_set($c, $object, $property, $value);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * initialiser $dest avec les valeurs de $values
 | |
|    *
 | |
|    * les noms des clés de $values sont transformées en camelCase pour avoir les
 | |
|    * noms des propriétés correspondantes
 | |
|    */
 | |
|   static final function set_values(object $object, ?array $values, ?array $keys=null): void {
 | |
|     if ($values === null) return;
 | |
|     if ($keys === null) $keys = array_keys($values);
 | |
|     $c = new ReflectionClass($object);
 | |
|     foreach ($keys as $key) {
 | |
|       if (array_key_exists($key, $values)) {
 | |
|         $property = str::us2camel($key);
 | |
|         self::_set($c, $object, $property, $values[$key]);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /** incrémenter la valeur d'une propriété */
 | |
|   static final function inc(object $object, string $property): int {
 | |
|     $c = new ReflectionClass($object);
 | |
|     try {
 | |
|       $p = $c->getProperty($property);
 | |
|       $p->setAccessible(true);
 | |
|       $value = (int)$p->getValue($object);
 | |
|       $value++;
 | |
|       $p->setValue($object, $value);
 | |
|     } catch (ReflectionException $e) {
 | |
|       if (property_exists($object, $property)) {
 | |
|         $value = (int)$object->$property;
 | |
|         $value++;
 | |
|       } else {
 | |
|         $value = 1;
 | |
|       }
 | |
|       $object->$property = $value;
 | |
|     }
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   /** décrémenter la valeur d'une propriété */
 | |
|   static final function dec(object $object, string $property, bool $allow_negative=false): int {
 | |
|     $c = new ReflectionClass($object);
 | |
|     try {
 | |
|       $p = $c->getProperty($property);
 | |
|       $p->setAccessible(true);
 | |
|       $value = (int)$p->getValue($object);
 | |
|       if ($allow_negative || $value > 0) {
 | |
|         $value --;
 | |
|         $p->setValue($object, $value);
 | |
|       }
 | |
|     } catch (ReflectionException $e) {
 | |
|       if (property_exists($object, $property)) {
 | |
|         $value = (int)$object->$property;
 | |
|       } else {
 | |
|         $value = 0;
 | |
|       }
 | |
|       if ($allow_negative || $value > 0) $value--;
 | |
|       $object->$property = $value;
 | |
|     }
 | |
|     return $value;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Fusionner la valeur à la propriété qui est transformée en tableau si
 | |
|    * nécessaire
 | |
|    */
 | |
|   static final function merge(object $object, string $property, $array): void {
 | |
|     $c = new ReflectionClass($object);
 | |
|     try {
 | |
|       $p = $c->getProperty($property);
 | |
|       $p->setAccessible(true);
 | |
|       $values = A::with($p->getValue($object));
 | |
|       A::merge($values, A::with($array));
 | |
|       $p->setValue($object, $values);
 | |
|     } catch (ReflectionException $e) {
 | |
|       if (property_exists($object, $property)) {
 | |
|         $values = A::with($object->$property);
 | |
|       } else {
 | |
|         $values = [];
 | |
|       }
 | |
|       A::merge($values, A::with($array));
 | |
|       $object->$property = $values;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Ajouter la valeur à la propriété qui est transformée en tableau si
 | |
|    * nécessaire
 | |
|    */
 | |
|   static final function append(object $object, string $property, $value): void {
 | |
|     $c = new ReflectionClass($object);
 | |
|     try {
 | |
|       $p = $c->getProperty($property);
 | |
|       $p->setAccessible(true);
 | |
|       $values = A::with($p->getValue($object));
 | |
|       $values[] = $value;
 | |
|       $p->setValue($object, $values);
 | |
|     } catch (ReflectionException $e) {
 | |
|       if (property_exists($object, $property)) {
 | |
|         $values = A::with($object->$property);
 | |
|       } else {
 | |
|         $values = [];
 | |
|       }
 | |
|       $values[] = $value;
 | |
|       $object->$property = $values;
 | |
|     }
 | |
|   }
 | |
| }
 |