update lock clucknut
All checks were successful
All checks were successful
This commit is contained in:
@@ -41,9 +41,11 @@ class LazyObjectRegistry
|
||||
public static array $classAccessors = [];
|
||||
|
||||
/**
|
||||
* @var array<class-string, int>
|
||||
* @var array<class-string, array{set: bool, isset: bool, unset: bool, clone: bool, serialize: bool, unserialize: bool, sleep: bool, wakeup: bool, destruct: bool, get: int}>
|
||||
*/
|
||||
public static array $parentGet = [];
|
||||
public static array $parentMethods = [];
|
||||
|
||||
public static ?\Closure $noInitializerState = null;
|
||||
|
||||
public static function getClassResetters($class)
|
||||
{
|
||||
@@ -84,16 +86,80 @@ public static function getClassResetters($class)
|
||||
return $resetters;
|
||||
}
|
||||
|
||||
public static function getParentGet($class): int
|
||||
public static function getClassAccessors($class)
|
||||
{
|
||||
return \Closure::bind(static fn () => [
|
||||
'get' => static function &($instance, $name, $notByRef) {
|
||||
if (!$notByRef) {
|
||||
return $instance->$name;
|
||||
}
|
||||
$value = $instance->$name;
|
||||
|
||||
return $value;
|
||||
},
|
||||
'set' => static function ($instance, $name, $value) {
|
||||
$instance->$name = $value;
|
||||
},
|
||||
'isset' => static fn ($instance, $name) => isset($instance->$name),
|
||||
'unset' => static function ($instance, $name) {
|
||||
unset($instance->$name);
|
||||
},
|
||||
], null, \Closure::class === $class ? null : $class)();
|
||||
}
|
||||
|
||||
public static function getParentMethods($class)
|
||||
{
|
||||
$parent = get_parent_class($class);
|
||||
$methods = [];
|
||||
|
||||
if (!$parent || !method_exists($parent, '__get')) {
|
||||
return 0;
|
||||
foreach (['set', 'isset', 'unset', 'clone', 'serialize', 'unserialize', 'sleep', 'wakeup', 'destruct', 'get'] as $method) {
|
||||
if (!$parent || !method_exists($parent, '__'.$method)) {
|
||||
$methods[$method] = false;
|
||||
} else {
|
||||
$m = new \ReflectionMethod($parent, '__'.$method);
|
||||
$methods[$method] = !$m->isAbstract() && !$m->isPrivate();
|
||||
}
|
||||
}
|
||||
|
||||
$m = new \ReflectionMethod($parent, '__get');
|
||||
$methods['get'] = $methods['get'] ? ($m->returnsReference() ? 2 : 1) : 0;
|
||||
|
||||
return !$m->isAbstract() && !$m->isPrivate() ? ($m->returnsReference() ? 2 : 1) : 0;
|
||||
return $methods;
|
||||
}
|
||||
|
||||
public static function getScopeForRead($propertyScopes, $class, $property)
|
||||
{
|
||||
if (!isset($propertyScopes[$k = "\0$class\0$property"]) && !isset($propertyScopes[$k = "\0*\0$property"])) {
|
||||
return null;
|
||||
}
|
||||
$frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2];
|
||||
|
||||
if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) {
|
||||
$scope = $frame['object']->class;
|
||||
}
|
||||
if ('*' === $k[1] && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $scope;
|
||||
}
|
||||
|
||||
public static function getScopeForWrite($propertyScopes, $class, $property, $flags)
|
||||
{
|
||||
if (!($flags & (\ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_READONLY | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET | \ReflectionProperty::IS_PROTECTED_SET : 0)))) {
|
||||
return null;
|
||||
}
|
||||
$frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2];
|
||||
|
||||
if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) {
|
||||
$scope = $frame['object']->class;
|
||||
}
|
||||
if ($flags & (\ReflectionProperty::IS_PRIVATE | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY))) {
|
||||
return $scope;
|
||||
}
|
||||
if ($flags & (\ReflectionProperty::IS_PROTECTED | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PROTECTED_SET : 0)) && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $scope;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user