Php 对象是否应该总是封装其方法所处理的数据?
我正在开发一个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 }
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基本上让您为每个线程创建卫生对象,再次存储不必要的数据或类函数的核心数据