2

我读过很多次关于封装的文章,但我总是看到这样的代码,我想知道同样的事情。是这种封装吗?

class create_active_parent{



function __construct(){
     //something
}


function clean_queues_redis(){
    //creating in this way an object, and using it, is not encapsulation, is it?
    $redis = RedisDB::fetch_instance();        
    $redis->db->flushdb();  
}
4

2 回答 2

3

封装就是对外部隐藏私有字段$redis只是一个局部变量,它会在clean_queues_redis方法执行结束时死掉。

于 2012-11-09T00:37:15.917 回答
0

关于封装:

想象一个管理来自一群人(例如,一些大公司或银行)的敏感数据的应用程序,我们可以编写以下类来说明我们如何处理这些信息。

public class Test {
    public static void main(String args[]) {
        CarbonBasedLifeform joeBloggs = new CarbonBasedLifeform("Joe Bloggs", "987-65-4320");
        System.out.println(joeBloggs.name);
    }
}
class CarbonBasedLifeform {
    String name;
    String SSN;
    public CarbonBasedLifeform(String name, String SSN)
    {
        this.name = name;
        this.SSN = SSN;     
    }
}

如果您运行此代码,您将创建一个名为“CarbonBasedLifeform”的类,并创建一个实例,Joe Bloggs,现在想象其他一些程序员正在向程序添加更多内容,他们开始弄乱这些数据,如果他们更改乔的社会安全号码?甚至他的名字?我们没有任何东西可以保护对类属性的访问,所以可以很容易地做到:

joeBloggs.SSN = "0987654321";

如果人们可以像这样修改彼此的文档并更改个人数据,那将是一个多么奇怪、令人不安的世界。Joe 是唯一可以通过官僚循环获取新文档的人,这些东西是私有的,这就是为什么向类属性添加修饰符以及控制对其值的访问的特殊方法是一种常见做法,即吸气剂和二传手:

class CarbonBasedLifeform {
    private String name;
    private String SSN;
    public CarbonBasedLifeform(String name, String SSN) {
        this.name = name;
        this.SSN = SSN;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSSN() {
        return this.SSN;
    }
    public void setSSN(String SSN) {
        if(verifyRedTape())
            this.SSN = SSN;
        }
    }
}

现在,其他类无法直接更改 Joe 的属性,因为属性被标记为private ,并且方法提供了一种机制来控制其他类如何与此数据交互,这就是所谓的封装,或者换句话说,不要触摸乔的私事!

于 2014-09-09T10:30:05.590 回答