Тупой эксперимент - создание C # -esque свойств в PHP - PullRequest
1 голос
/ 01 июля 2011

Я пытаюсь найти изящный способ создания C # -характерных свойств в PHP

Сейчас у меня есть:

class Example
{
    private $allowedProps = array('prop1', 'prop2', 'prop3');
    private $data = array();

    public function __set($propName, $propValue)
    {
        if (in_array($propName, $this->allowedProps))
        {
            // set property
        }
        else
        {
            // error
        }
    }

    public function __get($propName)
    {
        if (array_key_exists($propName, $this->data))
        {
            // get property
        }
        else
        {
            // error
        }
    }
}

В закомментированных разделах длячто-то более сложное, чем простая запись или извлечение из массива $data, проще всего было бы просто разделить логику, где это необходимо, с помощью if-else или switch.Это грязно, хотя и противоречит тому, что я хочу.Есть ли способ вызвать функцию обратного вызова, которая будет иметь доступ к массиву $data?


РЕДАКТИРОВАТЬ: кажется, что самое простое, что можно сделать:

class Example
{
    private $allowedProps = array('prop1', 'prop2', 'prop3');
    private $data = array();

    public function __set($propName, $propValue)
    {
        $propName = strtolower($propName);

        if (in_array($propName, $this->allowedProps))
        {
            $funcName = "set" . ucfirst($propName);
            $this->$funcName($propValue);
        }
        else
        {
            // error
        }
    }

    public function __get($propName)
    {
        $propName = strtolower($propName);

        if (array_key_exists($propName, $this->data))
        {
            $funcName = "get" . ucfirst($propName);
            $this->$funcName();
        }
        else
        {
            // error
        }
    }

    private function getProp1()
    {
        // do stuff, and return the value of prop1, if it exists
    }

    // ...
}

Я не уверен, стоит ли использовать множество частных методов установки и получения.Лямбды, вероятно, были бы идеальными, но они доступны только в PHP 5.3+.

1 Ответ

0 голосов
/ 05 июля 2011

По сути, это не совсем ответ, но я решил, что пока помечу его как решенный, поскольку у меня не было времени на дальнейшие эксперименты.Конечно, любые дополнительные предложения приветствуются.

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