问题标题看起来很混乱,但这就是我想要实现的目标。
我有两个班级
1. Category
2. Validation
在类别类中,我有以下类属性
public $error; //holds all errors in an array.
private $dbh; //Database object Handle(PDO).
private $validate; //Holds Validation Object
private $data = array('categoryName',
'subCategoryName',
'prefix',
'categoryId',
'subCategoryId');
验证类中的我已经定义了一个方法。
public function required($fields = array()) {
foreach($fields as $field) {
if(empty(__CLASS__::data[$field])) {
}
}
}
现在,当我在类$this->validate->required()
中调用方法Category
时,它应该检查条件,如果Category类的$ data [field]为空或者其中有任何值。因此我使用了以下似乎不起作用的语法。 if(empty(__CLASS__::data[$field]))
条件应该检查的是它的类的类属性$ data(在这种情况下是类Category)是否为空。动态获取类属性的正确语法是什么?
答案 0 :(得分:3)
将您的Category
实例作为参数提供给验证功能。你应该有这样的东西:
public function required($category, $fields = array()) {
foreach($fields as $field) {
if(empty($category->data[$field])) {
}
}
}
$this->validate->required($this);
此外,您不使用静态方法,如示例中的问题标题中所述。如果你在Validation
中有一个静态函数,你会这样称呼它:
Validation::required($this);
在这种情况下,您根本不需要引用Validation
类中的Category
实例。
答案 1 :(得分:1)
使用get_class_vars():$class_vars = get_class_vars(__CLASS__);
。请注意private $data
可能存在的可见性问题,因为根据文档get_class_vars()
返回了可以从当前范围访问的属性。
答案 2 :(得分:1)
不确定您要执行的操作,如果要在验证中访问类别属性,可以将$ data传递给函数调用:
// you could call required() this way ...
$this->validate->required($data);
// In validate::required()
public function required($fields = array()) {
foreach($fields as $field) {
if(empty($data[$field])) {
}
}
}
现在,您当然可以将数据设置为静态,但它不能很好地利用静态变量,尤其是因为您已经在父类中有了引用。
private static $data = array('categoryName',
'subCategoryName',
'prefix',
'categoryId',
'subCategoryId');
// and access it through :: operator in validation.
public function required() {
$fields = Category::$data;
foreach($fields as $field) {
if(empty($data[$field])) {
}
}
}
所以,我认为你是在正确的轨道上而不使用静态,除了你缺少的一件事,如果你想在类别中的验证对象,不要忘记创建它的实例,这里是一个简单的方法通过您的实例采用依赖注入的方式,以便于测试:
class Category{
private $validate; //Holds Validation Object
// constructer with type hinting,
public function __construct(Validator $validation){
// set validator object to this objects property.
$this->validate = $validation;
}
}
//create validator instance
$validator = new Validator;
// Pass it off to category,
$category = new Category($validator);
答案 3 :(得分:0)
我认为最好的方法是,不直接访问Category
中的数据,但将其作为参数添加到验证方法中。
像:
public function required($fields = array(), $required = array()) ...
除非另有说明,否则您的目的是解决encapsulation。
如果您仍想这样做,请将$data
声明为public static
,或使用php reflection。