$name ) ) { return $this->$name; } $data = (array)$this; // Protected variables have a '*' prepended to the variable name. // These prepended values have null bytes on either side. $protectedName = "\x00*\x00{$name}"; if ( isset( $data[$protectedName] ) ) { return $data[$protectedName]; } // Private variables have the class name prepended to the variable name. // These prepended values have null bytes on either side. $thisClass = get_class( $this ); $privateName = "\x00{$thisClass}\x00{$name}"; if ( isset( $data[$privateName] ) ) { return $data[$privateName]; } // Check old aliased class names as well. foreach ( $aliases as $thisClass ) { $privateName = "\x00{$thisClass}\x00{$name}"; if ( isset( $data[$privateName] ) ) { return $data[$privateName]; } } return null; } /** * In PHP <= 8.1, private fields of a class are not properly restored * when the class is aliased to a new name, since the private fields are * prefixed with the *old* name of the class. This method can be used * to restore them if present after deserialization. * * @param string $name * @param class-string ...$aliases */ private function restoreAliasedGhostField( string $name, string ...$aliases ): void { $data = (array)$this; foreach ( $aliases as $thisClass ) { $privateName = "\x00{$thisClass}\x00{$name}"; if ( isset( $data[$privateName] ) ) { $this->$name = $data[$privateName]; unset( $data[$privateName] ); return; } } } }