Php 对象是否应该总是封装其方法所处理的数据?

Php 对象是否应该总是封装其方法所处理的数据?,php,oop,design-patterns,immutability,Php,Oop,Design Patterns,Immutability,我正在开发一个PHP类,RequestSanitize,它将处理一些原始用户输入。我可以这样做的一个方法是: class DataSanitizer implements DataSanitizerInterface { protected $_schema; public function __construct($schema){ $this->_schema = $schema; // Blah blah blah }

我正在开发一个PHP类,
RequestSanitize
,它将处理一些原始用户输入。我可以这样做的一个方法是:

class DataSanitizer implements DataSanitizerInterface {
    protected $_schema;

    public function __construct($schema){
        $this->_schema = $schema;
        // Blah blah blah
    }

    public function sanitize($data) {
        $sanitizedData = [];

        // Blah blah blah populate $sanitizedData

         ...
        return $sanitizedData;
    }
}
因此,基本上,只要调用
sanitize
,该类就提供模式。因此,它的使用方式如下:

$ds = new DataSanitizer("/path/to/schema");
$sanitizedData = $ds->sanitize($_GET);
$ds = new DataSanitizer("/path/to/schema");
$ds->sanitize($_GET);
$sanitizedData = $ds->data();
在这种情况下,我甚至可以使
清理
成为静态成员

另一种选择是:

class DataSanitizer implements DataSanitizerInterface {
    protected $_schema;
    protected $_sanitizedData = [];

    public function __construct($schema){
        $this->_schema = $schema;
        // Blah blah blah
    }

    public function sanitize($data) {
        // Blah blah blah

        $this->_sanitizedData = ...
        return $this;
    }

    public function data(){
        return $this->_sanitizedData;
    }
}
它会像这样被使用:

$ds = new DataSanitizer("/path/to/schema");
$sanitizedData = $ds->sanitize($_GET);
$ds = new DataSanitizer("/path/to/schema");
$ds->sanitize($_GET);
$sanitizedData = $ds->data();
就即时设计和未来可扩展性而言,一种设计模式比另一种更有意义吗?或者,我应该使用第三种可能更好的设计模式吗?

在我看来, 如果使用接口类,则可以在接口上定义属性和函数。因为接口可以从多个类实现。 如果是这样的话,方法1应该更方便

若您可以只使用类而不从其他接口实现,那个么最好使用方法2。

我更喜欢选项1。IMO更干净、更易于使用,选项2在第一个选项中没有提供任何好处或功能

从更高的层次考虑,封装用于隐藏数据和实现细节,以完成类中定义的任务。在选项2中,您并不是真正隐藏实现细节,而是以“封装”的名义要求类为您存储一些不必要的东西

如果您处于多线程环境中,选项#1还允许跨线程更轻松地重用对象。这就需要对实际用于卫生的东西的可重入性进行大量假设,但是#2基本上让您为每个线程创建卫生对象,再次存储不必要的数据或类函数的核心数据