如何从PHP中的其他类使用STATIC方法访问类属性?

时间:2011-06-07 07:36:37

标签: php class static

问题标题看起来很混乱,但这就是我想要实现的目标。

我有两个班级

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)是否为空。动态获取类属性的正确语法是什么?

谢谢..

4 个答案:

答案 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