Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.php > #18970
| From | Meredith Montgomery <mmontgomery@levado.to> |
|---|---|
| Newsgroups | comp.lang.php |
| Subject | a question on |
| Date | 2022-06-02 17:25 -0300 |
| Organization | Aioe.org NNTP Server |
| Message-ID | <864k12ertd.fsf@levado.to> (permalink) |
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 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 — 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