Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.php > #18972

a question on a PayPal's ReflectionUtil (Was: Re: a question on)

From Meredith Montgomery <mmontgomery@levado.to>
Newsgroups comp.lang.php
Subject a question on a PayPal's ReflectionUtil (Was: Re: a question on)
Date 2022-06-02 17:32 -0300
Organization Aioe.org NNTP Server
Message-ID <86r146dcxj.fsf@levado.to> (permalink)
References <864k12ertd.fsf@levado.to>

Show all headers | View raw


Sorry about the incomplete subject.  I'm fixing that.  I think I also
understood a bit more about the code I'm asking, so I'm going to add an
addendum.  Sorry about this small mess.

Meredith Montgomery <mmontgomery@levado.to> writes:

> The file 
>
>   PayPal/Common/ReflectionUtil.php
>
> --- whose content I show entirely below --- seems to be a class with
> only static methods and static properties.  Now, check the procedure
>
>   public static function propertyAnnotations($class, $propertyName)
>
> It contains the chunk
>
>   if (!($refl =& self::$propertiesRefl[$class][$propertyName])) {
>       $getter = self::getter($class, $propertyName);
>       $refl = new \ReflectionMethod($class, $getter);
>       self::$propertiesRefl[$class][$propertyName] = $refl;
>   }
>
> So $refl is instantiated and it is stored in 
>
>   self::$propertiesRefl[$class][$propertyName]
>
> which is a private static array.  This means it cannot be acessed from
> the ``outside''.  Also, no other chunk in this class uses
> $propertiesRefl.
>
> Question.  Why are they storing $refl if nobody uses it all, not even
> the very class that defines it?  

Actually, it clearly does use $refl.  It's used right at the first line
in the chunk above.  It is set merely so the if-inner-code is only
executed once in its lifetime.  Why?  Can you just clarify to me what's
going on this class?  I'm not understanding it too clearly.  Thank you!

>
> (*) PayPal/Common/ReflectionUtil.php
>
> <?php
>
> namespace PayPal\Common;
> use PayPal\Exception\PayPalConfigurationException;
>
> /**
>  * Class ReflectionUtil
>  *
>  * @package PayPal\Common
>  */
> class ReflectionUtil
> {
>
>     /**
>      * Reflection Methods
>      *
>      * @var \ReflectionMethod[]
>      */
>     private static $propertiesRefl = array();
>
>     /**
>      * Properties Type
>      *
>      * @var string[]
>      */
>     private static $propertiesType = array();
>
>
>     /**
>      * Gets Property Class of the given property.
>      * If the class is null, it returns null.
>      * If the property is not found, it returns null.
>      *
>      * @param $class
>      * @param $propertyName
>      * @return null|string
>      * @throws PayPalConfigurationException
>      */
>     public static function getPropertyClass($class, $propertyName)
>     {
>         if ($class == get_class(new PayPalModel())) {
>             // Make it generic if PayPalModel is used for generating this
>             return get_class(new PayPalModel());
>         }
>
>         // If the class doesn't exist, or the method doesn't exist, return null.
>         if (!class_exists($class) || !method_exists($class, self::getter($class, $propertyName))) {
>             return null;
>         }
>
>         if (($annotations = self::propertyAnnotations($class, $propertyName)) && isset($annotations['return'])) {
>             $param = $annotations['return'];
>         }
>
>         if (isset($param)) {
>             $anno = preg_split("/[\s\[\]]+/", $param);
>             return $anno[0];
>         } else {
>             throw new PayPalConfigurationException("Getter function for '$propertyName' in '$class' class should have a proper return type.");
>         }
>     }
>
>     /**
>      * Checks if the Property is of type array or an object
>      *
>      * @param $class
>      * @param $propertyName
>      * @return null|boolean
>      * @throws PayPalConfigurationException
>      */
>     public static function isPropertyClassArray($class, $propertyName)
>     {
>         // If the class doesn't exist, or the method doesn't exist, return null.
>         if (!class_exists($class) || !method_exists($class, self::getter($class, $propertyName))) {
>             return null;
>         }
>
>         if (($annotations = self::propertyAnnotations($class, $propertyName)) && isset($annotations['return'])) {
>             $param = $annotations['return'];
>         }
>
>         if (isset($param)) {
>             return substr($param, -strlen('[]'))==='[]';
>         } else {
>             throw new PayPalConfigurationException("Getter function for '$propertyName' in '$class' class should have a proper return type.");
>         }
>     }
>
>     /**
>      * Retrieves Annotations of each property
>      *
>      * @param $class
>      * @param $propertyName
>      * @throws \RuntimeException
>      * @return mixed
>      */
>     public static function propertyAnnotations($class, $propertyName)
>     {
>         $class = is_object($class) ? get_class($class) : $class;
>         if (!class_exists('ReflectionProperty')) {
>             throw new \RuntimeException("Property type of " . $class . "::{$propertyName} cannot be resolved");
>         }
>
>         if ($annotations =& self::$propertiesType[$class][$propertyName]) {
>             return $annotations;
>         }
>
>         if (!($refl =& self::$propertiesRefl[$class][$propertyName])) {
>             $getter = self::getter($class, $propertyName);
>             $refl = new \ReflectionMethod($class, $getter);
>             self::$propertiesRefl[$class][$propertyName] = $refl;
>         }
>
>         // todo: smarter regexp
>         if ( !preg_match_all(
>             '~\@([^\s@\(]+)[\t ]*(?:\(?([^\n@]+)\)?)?~i',
>             $refl->getDocComment(),
>             $annots,
>             PREG_PATTERN_ORDER)) {
>             return null;
>         }
>         foreach ($annots[1] as $i => $annot) {
>             $annotations[strtolower($annot)] = empty($annots[2][$i]) ? TRUE : rtrim($annots[2][$i], " \t\n\r)");
>         }
>
>         return $annotations;
>     }
>
>     /**
>      * preg_replace_callback callback function
>      *
>      * @param $match
>      * @return string
>      */
>     private static function replace_callback($match)
>     {
>         return ucwords($match[2]);
>     }
>
>     /**
>      * Returns the properly formatted getter function name based on class name and property
>      * Formats the property name to a standard getter function
>      *
>      * @param string $class
>      * @param string $propertyName
>      * @return string getter function name
>      */
>     public static function getter($class, $propertyName)
>     {
>         return method_exists($class, "get" . ucfirst($propertyName)) ?
>             "get" . ucfirst($propertyName) :
>             "get" . preg_replace_callback("/([_\-\s]?([a-z0-9]+))/", "self::replace_callback", $propertyName);
>     }
> }

Back to comp.lang.php | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

a question on Meredith Montgomery <mmontgomery@levado.to> - 2022-06-02 17:25 -0300
  a question on a PayPal's ReflectionUtil (Was: Re: a question on) Meredith Montgomery <mmontgomery@levado.to> - 2022-06-02 17:32 -0300
    Re: a question on a PayPal's ReflectionUtil (Was: Re: a question on) "J.O. Aho" <user@example.net> - 2022-06-03 08:10 +0200
      Re: a question on a PayPal's ReflectionUtil (Was: Re: a question on) V <techfan55555@hotmail.com> - 2023-03-17 07:07 -0700

csiph-web