Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
68.75% covered (warning)
68.75%
11 / 16
60.00% covered (warning)
60.00%
3 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
BorshDeserializable
68.75% covered (warning)
68.75%
11 / 16
60.00% covered (warning)
60.00%
3 / 5
14.69
0.00% covered (danger)
0.00%
0 / 1
 borshConstructor
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 __set
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
3
 __isset
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
 __unset
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 isPrivateProperty
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2namespace Attestto\SolanaPhpSdk\Borsh;
3use ReflectionClass;
4trait BorshDeserializable
5{
6    /**
7     * Create a new instance of this object.
8     *
9     * Note: must override when the default constructor required parameters!
10     *
11     * @return $this
12     */
13    public static function borshConstructor()
14    {
15        return new static();
16    }
17
18    /**
19     * Magic setter to dynamically set properties.
20     *
21     * @param string $name
22     * @param mixed $value
23     */
24    public function __set(string $name, mixed $value)
25    {
26        // Set the value in the dynamic properties if it's not private
27        if (!$this->isPrivateProperty($name)) {
28            $this->fields[$name] = $value;
29        }
30
31        // Check if the property exists as a private property
32        if ($this->isPrivateProperty($name)) {
33            // Use reflection to set the value of the private property
34            $reflectionClass = new ReflectionClass($this);
35            $property = $reflectionClass->getProperty($name);
36            $property->setAccessible(true);
37            $property->setValue($this, $value);
38        }
39    }
40
41    /**
42     * Magic isset to check if dynamically set property is set.
43     *
44     * @param string $name
45     *
46     * @return bool
47     */
48    public function __isset(string $name)
49    {
50        return isset($this->fields[$name]) || isset($this->private[$name]);
51    }
52
53    /**
54     * Magic unset to unset dynamically set property.
55     *
56     * @param string $name
57     */
58    public function __unset(string $name)
59    {
60        if (isset($this->fields[$name])) {
61            unset($this->fields[$name]);
62        } elseif ( isset($this->private[$name])) {
63            unset($this->privateProperties[$name]);
64        }
65    }
66
67    /**
68     * Determine if a property is considered private.
69     *
70     * @param string $name
71     *
72     * @return bool
73     */
74    private function isPrivateProperty(string $name): bool
75    {
76        // Get the class name ( whatever class is implementing this trait, e.g. Any Schema/Struct based object
77        $className = static::class;
78
79        // Create a ReflectionClass instance for the class
80        $reflectionClass = new ReflectionClass($className);
81
82        // Check if the property is declared in the class and is private
83        return $reflectionClass->hasProperty($name) && $reflectionClass->getProperty($name)->isPrivate();
84    }
85}