愚蠢的实验-在PHP中创建C#风格的属性

本文关键字:创建 风格 属性 实验 PHP | 更新日期: 2023-09-27 18:00:48

我正试图想出一种优雅的方法来在PHP 中创建C#风格的属性

现在,我有:

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-elseswitch简单地分支逻辑。不过,这很混乱,与我想要的背道而驰。是否有方法调用可以访问$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
    }
    // ...
}

我不确定拥有大量的私有setter和getter方法是否是可行的。Lambdas可能是理想的,但它们只能在PHP 5.3+中使用。

愚蠢的实验-在PHP中创建C#风格的属性

这本身并不是一个真正的答案,但我想我现在会把它标记为已解决,因为我还没有时间进行进一步的实验。当然,欢迎任何其他建议。