Для получения полного доступа
зарегистрируйтесь

Класс для ограничения свойства объекта определенным контрактом PHP


Простой класс, который будет определять принадлежит ли свойство у которого есть определенная форма написания определенному контракту (интерфейсу/классу).

Для надежности можно нужное свойство, у которого должен быть определенный контракт можно закрыть модификатором доступа protected, хотя врядли вы станете обращаться к такому монстро-свойству.

Для проверки контрактов всех свойств нужно вызвать метод check, может быть было бы и не плохо реализовать метод проверки одного конкретного свойства.

Код:

<?php
class Foo extends ContractsChecker {
    protected $separator = 'Contracted';
    protected $FooContractContractedProperty;
}
class ContractsChecker
{
    public $separator = '_';
    public $propertyArray = array();
    
    public function check() {
        $check_good = false;
        foreach ($this->getPropertyNames() as $property) {
            $contract = explode($this->separator, $property);
            if (!isset($contract[1])) {
                continue;
            }
            if ($this->$property instanceof $contract[0]) {
                $check_good = true;
            } else {
                return false;
            }
        }
        return $check_good;
    }

    public function __set($property, $value) {
        $properties = $this->getPropertyNames();
        $matches  = preg_grep ('/' . $this->separator
        . $property . '$/i', $properties);
        foreach ($matches as $match) {
            $this->$match = $value;
        }
    }
    
    private function getPropertyNames() {
        if (empty($this->propertyArray)) {
            $this->propertyArray = array_keys(get_class_vars(get_class($this)));
        }
        return $this->propertyArray;
    }
}

interface FooContract {
    public function getHello();
}

class Bar implements FooContract {
    public $hello;

    public function getHello() {
        return $this->hello;
    }
}

$foo = new Foo();
$foo->property = new Bar();

/**
 * Вернет true потому что Bar
 * реализует FooContract
 */
var_dump($foo->check());

Чтобы увидеть комментарии, нужно быть участником сообщества

Регистрация