oop 编程的几个问题
[toc] //md 内容表
类和对象的关系
- 类的实体化结果是对象,而对象的抽象就是类,在开发过程中,我们通常都是先抽象(幻想)出一个类,再用该类去创建对象(实现幻想的内容)。在程序中,直接使用的是我们(实现幻想)的对象,而不是抽象(幻想)的类
oop 的封装性/构造函数的作用
- 其实所谓的 oop 的封装性就是像一个人的特征,
- 有公开的 public,名字
- 有受保护的 protected,生日,密码,
- 有私有的 private,自己的思想
使用修饰符来对属性和方法进行封装:
class Person
{
//下面是人的成员属性
protected $name; //人的名子,被protected封装上了
protected $birthday; //人的生日, 被protected封装上了
private $dream; //人的梦想, 被private封装上了
//定义一个构造方法参数为私有的属性姓名$name、生日$birthday和梦想$dream进行赋值
function __construct($name, $birthday, $dream) {
//通过构造方法传进来的$name给私有成员属性$this->name赋初使值
$this->name = $name;
//通过构造方法传进来的$birthday给私有成员属性$this->birthday赋初使值
$this->birthday = $birthday;
//通过构造方法传进来的$dream给私有成员属性$this->dream赋初使值
$this->dream = $dream;
}
//这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法
function say() {
echo "我的名子叫:" . $this->name . " 生日:" . $this->birthday . " 我的梦想是:" . $this->dream;
}
//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、生日和梦想
//要new一下
$p1 = new Person("张三", "0811", 有金钱);
$p2 = new Person("李四", "0621", 有妹子);
$p3 = new Person("王二", "0308", 有权利);
//下面访问$p1对象中的说话方法
$p1->say();
//下面访问$p2对象中的说话方法
$p2->say();
//下面访问$p3对象中的说话方法
$p3->say();
注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字”var”。
通过修饰符(public. protected. private)就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员访问就被限制了,public(公共). protected(本类,子类). private(自己)没有加任何访问控制,默认的是 public
因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到,这样就可以使用构造方法创建对象, 另外构造方法也是类里面的函数,所以可以用构造方法给私有的属性赋初值。Say()的方法是默认公有的, 所以在外面也可以访问的到, 说出他自己的私有属性。
私有的成员只能在类的内部使用, 不能被类外部直接来存取, 但是在类的内部是有权限访问的, 所以有时候我们需要在类的外面给私有属性赋值和读取出来,也就是给类的外部提供一些可以存取的接口,上例中构造方法就是一种赋值的形式, 但是构造方法只是在创建对象的时候赋值,如果我们已经有一个存在的对象了,想对这个存在的对象赋值, 这个时候,如果你还使用构造方法传值的形式传值, 那么就创建了一个新的对象,并不是这个已存在的对象了。所以我们要对私有的属性做一些可以被外部存取的接口,目的就是可以在对象存在的情况下,改变和存取 属性的值,但要注意,只有需要让外部改变的属性才这样做,不想让外面访问的属性是不做这样的接口的,这样就能达到封装的目的,所有的功能都是对象自己来完成,给外面提供尽量少的操作。
如果给类外部提供接口,可以为私有属性在类外部提供设置方法和获取方法,来操作私有属性。例如:
prvate $age; //私有的属性年龄
function setAge($age) { //为外部提供一个公有设置年龄的方法
if ($age<0 || $age>100) //在给属性赋值的时候,为了避免非法值设置给属性
return;
$this->age = $age;
}
function getAge() { //为外部提供一个公有获取年龄的方法
return($this->age);
}
上面的方法是为一个成员属性设置和获取值, 可以为每个属性用同样的方法对其进行赋值和取值的操作,完成在类外部的存取工作。