82 lines
2.4 KiB
PHP
82 lines
2.4 KiB
PHP
<?php
|
||
/**
|
||
* Created by PhpStorm.
|
||
* User: Zuev Yuri
|
||
*/
|
||
|
||
namespace Base\Domain;
|
||
|
||
abstract class AbstractObject {
|
||
|
||
/**
|
||
* @param array $data
|
||
* @return static
|
||
*/
|
||
public static function fromData(array $data) : static {
|
||
$self = new static();
|
||
$self->setProperties($data);
|
||
return $self;
|
||
}
|
||
|
||
/**
|
||
* @param array $data
|
||
* @return $this
|
||
*/
|
||
public function setProperties(array $data) : self {
|
||
$propArray = array_keys(get_class_vars(get_class($this)));
|
||
foreach ($propArray as $propName)
|
||
{
|
||
$propNameSnakeCase = strtolower(preg_replace("'([A-Z])'", "_$1", $propName));
|
||
|
||
// если в переданном массиве ключ и свойство совпадают optionId = optionId
|
||
if(isset($data[$propName])) {
|
||
$this->{$propName} = (method_exists($this, 'set'.ucfirst($propName))) ? $this->{'set'.ucfirst($propName)}($data[$propName]) : $data[$propName];
|
||
}
|
||
// если свойство в снэйккесе совподает с ключем в массиве option_id = optionId
|
||
elseif(isset($data[$propNameSnakeCase])) {
|
||
$this->{$propName} = (method_exists($this, 'set'.ucfirst($propName))) ? $this->{'set'.ucfirst($propName)}($data[$propNameSnakeCase]) : $data[$propNameSnakeCase];
|
||
}
|
||
}
|
||
return $this;
|
||
}
|
||
|
||
/**
|
||
* @param callable|null $method
|
||
* @return array
|
||
*/
|
||
public function getProperties(callable $method = null) : array {
|
||
$objectData = get_object_vars($this);
|
||
foreach ($objectData as $fieldName => $value)
|
||
{
|
||
$fieldNameSnakeCase = strtolower(preg_replace("'([A-Z])'", "_$1", $fieldName));
|
||
|
||
// если есть внутренний метод
|
||
if(method_exists($this, 'get'.ucfirst($fieldName))) {
|
||
$out[$fieldNameSnakeCase] = $this->{'get'.ucfirst($fieldName)}($value);
|
||
}
|
||
// если есть callable функция
|
||
elseif(isset($method) && !is_array($value)) {
|
||
$out[$fieldNameSnakeCase] = $method($value);
|
||
}
|
||
// если это логическое значение
|
||
elseif(is_bool($value)){
|
||
$out[$fieldNameSnakeCase] = (int) $value;
|
||
}
|
||
// если это дробное число
|
||
elseif(is_float($value)) {
|
||
$out[$fieldNameSnakeCase] = $value;
|
||
}
|
||
// если это целое число
|
||
elseif(is_int($value)) {
|
||
$out[$fieldNameSnakeCase] = $value;
|
||
}
|
||
// если это строка
|
||
elseif(is_string($value)) {
|
||
$out[$fieldNameSnakeCase] = $value;
|
||
}
|
||
|
||
}
|
||
return $out ?? [];
|
||
}
|
||
|
||
} |