Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.php > #18972
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar | Unroll 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