首页 > 解决方案 > PHP:有没有办法设置一个类,这样你就可以修改类的属性而不给它重新赋值?

问题描述

我正在为我正在开发的 MVC 框架设置一个名为 DataMapper 的类。

DataMapper 类将基本上包含一堆将数据模型结构映射到数据库表/列结构的规则 - 它将列出每个规则的标准。

Rule 类的更简单版本如下所示(请记住,这些代码片段是示例):

class DataMapRule {
    // required rule properties
    public $required = array("modelName", "columnName", "type");
    // optional values
    public $options = array("minVal", "nullOrempty", "maxCharLength");

    public $finalRule = array();

    // model property is the prop name in the model
    // column name is
    public function __construct($modelProperty = "", $columnName = "", $type = "") {
        $this->finalRule["modelName"] = $modelProperty;
        $this->finalRule["columnName"] = $columnName;
        $this->finalRule["type"] = $type;
    }


    public function addCriteria($option, $val) {
        if(in_array($option, $this->options)) {
            $this->finalRule[$option] = $val;
        }
    }
}

扩展 DataMapper 类的更简单版本如下所示:

class UserDataMapper extends DataMapper {
    public $map = array();
    public function __construct() {
        $rule = new DataMapRule("_age", "Age", "int");
        $rule->addCriteria("minVal", "1");
        $rule->addCriteria("nullOrEmpty", false);
        $this->map[] = $rule->finalRule;
        $rule = new DataMapRule("_firstName", "FirstName", "string");
        $rule->addCriteria("maxCharLength", 50);
        $rule->addCriteria("nullOrEmpty", false);
        $this->map[] = $rule->finalRule;
    }

}

我将为我的所有模型/模块创建这些映射和规则。

我想做的是清理代码/使其更容易编码和遵循。有什么方法可以设置类,以便在 DataMapper 构造函数中我可以执行以下操作:

    public function __construct() {
        $this->map[] = new DataMapRule("_firstName", "FirstName", "string")
            ->addCriteria("maxCharLength", 50)
            ->addCriteria("nullOrEmpty", false)
            ->finalRule;
    }

标签: phpmysql

解决方案


这通常称为“流体”接口,要实现这一点,您真正需要做的就是$this从您的addCriteria()函数中返回。

public function addCriteria($option, $val) {
    if(in_array($option, $this->options)) {
        $this->finalRule[$option] = $val;
    }
    return $this;
}

返回$this是意味着您可以addCriteria 再次调用结果addCriteria


推荐阅读