While trying to build a class properties and fields from passed in fields using a Trait, I am running into the following error "Uncaught Error: Using $this when not in object context".
My method:
public function createNewPet(array $petData): bool {
  return self::save($petData);
}
My method is calling the save() method:
/**
 * @param array|null $fields
 * @return bool|null
 * @throws \ReflectionException
*/
public function save(?array $fields = null): ?bool
{
        $values = [];
        if (isset($fields)) {
            foreach (Helper::getNonStaticProperties(static::class, false) as $prop) {
                if (!property_exists(static::class, $prop)) {
                    continue;
                }
                $values[$prop] = $this->{$prop};
            }
        } else {
            if (!is_array($fields)) {
                $fields = [$fields];
            }
            foreach ($fields as $field) {
                if (property_exists(static::class, $field)) {
                    $values[$field] = $this->{$field};
                }
            }
        }
}
You can see this method references the following helper method getNonStaticProperties():
/**
     * @param string $object
     * @param bool $includeParentProperties
     * @param bool $includeTraitProperties
     * @return array
     * @throws \ReflectionException
     */
    public static function getNonStaticProperties(
        string $object,
        bool $includeParentProperties = true,
        bool $includeTraitProperties = false
    ) :array
    {
        if (!class_exists($object)) {
            return []; //If $object is not a valid class, return empty array
        }
        //Create a reflection of the passed object
        $reflection = new \ReflectionClass($object);
        $static = $reflection->getStaticProperties(); //Get the reflections static properties
        $allArr = $reflection->getProperties(); //Get the reflections properties
        $all = null;
        $static = array_keys($static);
        foreach ($allArr as $prop) {
            $all[] = trim($prop->name);
        }
        if (!is_array($all)) {
            $all = [$all];
        }
        if (!is_array($static) || empty($static)) { //If $static is empty, simply return $all
            $result = $all;
        } else { // Return the list of variables that are present in $all but not present in $static
            $result =  array_diff($all, $static);
        }
        if (!$includeParentProperties && $parent = get_parent_class($object)) {
            $parentProps = self::getNonStaticProperties($parent, true);
            $result = array_diff($result, $parentProps);
        }
        if ($includeTraitProperties && !empty($traits = $reflection->getTraits())) {
            $traitProps = [];
            foreach ($traits as $trait) {
                $traitProperties = $trait->getProperties();
                foreach ($traitProperties as $prop) {
                    $traitProps[] = trim($prop->getName());
                }
            }
            $result = array_diff($result, $traitProps);
        }
        return $result;
    }
Update: Added the method (shown in comment) to the question.
 
    