• a question on

    From Meredith Montgomery@21:1/5 to All on Thu Jun 2 17:25:18 2022
    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?

    Thank you for any information on this.

    (*) PayPal/Common/ReflectionUtil.php

    <?php

    namespace PayPal\Common;
    use PayPal\Exception\PayPalConfigurationException;

    /**
    * Class Re
  • From Meredith Montgomery@21:1/5 to Meredith Montgomery on Thu Jun 2 17:32:08 2022
    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);
    }
    }

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From J.O. Aho@21:1/5 to Meredith Montgomery on Fri Jun 3 08:10:44 2022
    On 02/06/2022 22.32, Meredith Montgomery wrote:
    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!

    Yes, the inner code in this section will be called once for each
    combination of "class" and "propertyName".
    The function will return a array of annotations (read a bit about it
    here: https://www.educba.com/php-annotations )

    It's most likely used to setup correct check for input values client
    side and maybe even for post value validation.

    --

    //Aho

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From V@21:1/5 to J.O. Aho on Fri Mar 17 07:07:45 2023
    Let's get to know each other. Me: http://kohtumispaik.000webhostapp.com/Infovahetusteks/dpic/1679061026.gif

    Have a nice day......









    On Friday, June 3, 2022 at 8:10:54 AM UTC+2, J.O. Aho wrote:
    On 02/06/2022 22.32, Meredith Montgomery wrote:
    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 <mmont...@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!
    Yes, the inner code in this section will be called once for each
    combination of "class" and "propertyName".
    The function will return a array of annotations (read a bit about it
    here: https://www.educba.com/php-annotations )

    It's most likely used to setup correct check for input values client
    side and maybe even for post value validation.

    --

    //Aho

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)