除了常用的 __get 方法外,记录一个反射API的方法。
/**
* set class's public/private/protected property
*
* @param object $class
* @param string $variant property name
* @param string $value value
*
* @return array
*/
if (!function_exists('set_property'))
{
function set_property($class, $variant, $value)
{
if (!is_object($class)) throw new Exception('paramater #0 must be an object\'s instance.', 1);
$property = (new ReflectionClass($class))->getProperty($variant);
$property->setAccessible(true);
return $property->setValue($class, $value);
}
}
/**
* get class's public/private/protected property
*
* @param object $class
* @param string $variant property name
*
* @return array
*/
if (!function_exists('get_property'))
{
function get_property($class, $variant)
{
if (!is_object($class)) throw new Exception('paramater #0 must be an object\'s instance.', 1);
$property = (new ReflectionClass($class))->getProperty($variant);
$property->setAccessible(true);
return $property->getValue($class);
}
}
/**
* call class's public/private/protected method
*
* @param object $class
* @param string $variant property name
* @param string $value value
*
* @return array
*/
if (!function_exists('call_class_method_array'))
{
function call_class_method_array($class, $method, $parameters)
{
if (!is_object($class)) throw new Exception('paramater #0 must be an object\'s instance.', 1);
$reflectionMethod = (new ReflectionClass($class))->getMethod($method);
$reflectionMethod->setAccessible(true);
return $reflectionMethod->invokeArgs($class, $parameters);
}
}
/**
* call class's public/private/protected method
*
* @param object $class
* @param string $variant property name
* @param string $value value
*
* @return array
*/
if (!function_exists('call_class_method'))
{
function call_class_method($class, $method, ...$parameters)
{
if (!is_object($class)) throw new Exception('paramater #0 must be an object\'s instance.', 1);
$reflectionMethod = (new ReflectionClass($class))->getMethod($method);
$reflectionMethod->setAccessible(true);
return $reflectionMethod->invokeArgs($class, $parameters);
}
}
===========
实例代码:
$a = new \ReflectionClass(CouponStatistics::class); $property = $a->getProperty('fillable'); $property->setAccessible(true); $class = $property->getValue($a->newInstance());