Path: csiph.com!aioe.org!0Z6C6fhbX6bqLEMQtPplTA.user.46.165.242.91.POSTED!not-for-mail From: Meredith Montgomery Newsgroups: comp.lang.php Subject: a question on a PayPal's ReflectionUtil (Was: Re: a question on) Date: Thu, 02 Jun 2022 17:32:08 -0300 Organization: Aioe.org NNTP Server Message-ID: <86r146dcxj.fsf@levado.to> References: <864k12ertd.fsf@levado.to> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: gioia.aioe.org; logging-data="29789"; posting-host="0Z6C6fhbX6bqLEMQtPplTA.user.gioia.aioe.org"; mail-complaints-to="abuse@aioe.org"; Cancel-Lock: sha1:kgyg0I27aiD0Xk5qwtLAZ8Y8Qr0= X-Notice: Filtered by postfilter v. 0.9.2 Xref: csiph.com comp.lang.php:18972 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 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 > > > 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); > } > }