面向对象的三大特性
封装性
封装性是面向对象编程中的三大特性之一,封装性就是将对象的状态信息(属性)和行为(方法)捆绑为一个逻辑单元。只保留有限的对外接口使之与外部发生联系。
特性
对象意外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的”交叉感染”,使错误能够局部化,大大减少查错和拍错的难度.
例如:快递包裹里的东西、个人电脑的密码。这种密闭的东西、别人无法知道获得、除非你说(方法行为)出去。
封装的优势
隐藏一个类的实现细节;
防止对封装数据的未经授权的访问。使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
有利于保证数据的完整性,增强代码的可维护性。
访问控制修饰符
public公开的
private私有的
protected受保护
<?php
class woman{
public $name;
private $age=36; //私有的 是保密的
public function sayAge(){
echo "我的年龄是".$this->age."<br/>";
}
public function setAge($age=null)
{
$this->age=$age;
}
}
$mm=new woman();
$mm->name="范冰冰";
echo $mm->name;
echo "<br/>";
//echo $mm->age; //这时候则会报错 Fatal error: Uncaught Error: Cannot access private property woman::$age in F:\Work\test.php on line 19
echo $mm->sayAge();
按照上面所说、你想知道范冰冰的年龄、你不知道,要她说出去,你才能知道。
继承
什么是继承
。一般来说PHP有这样的一个类包含了基本属性和方法。其他的类可以基于这个类,扩展、增加属性方法或修改、实现类的复用,那就是继承,那么这个类也叫基类(父类、超类)、PHP是单继承的。
如山地自行车(属性:两个车轱辘。方法:骑行、刹车)和电动自行车(具有山地车的属性和方法:增加电车和电机)。电动自行车是普通自行车的扩展而来。普通自行车是佃电动自行车的基础。
继承的关键字 extends
<?php
class Animal{
public $name=null;
public function shout()
{
echo $this->name."这个动物在叫";
}
}
/**
* PHP继承的语法
* 子类 extends 父类{......}
*/
class Dog extends Animal{
public $name='Dog';
public $owner ="李四";
public function swin()
{
echo "狗会游泳";
}
}
$Dog= new Dog();
$Dog->shout();
echo "<br/>";
$Dog->swin();
Dog继承了Animal的方法和属性,Dog重写了Animal的属性、扩展了siwn方法。但是私有private的属性和方法是不能在子类调用的。
PHP的访问控制修饰符
<?php
class Human {
public $name;
public $sex;
protected $age; //受保护属性
private $addr; //私有属性
private $data = array(); //存储未定义属性的数组
public function __construct($name, $sex, $age, $addr) {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
$this->addr = $addr;
}
public function walking() {
}
protected function html() {
}
}
//实例化对象
$jack = new Human("Jack", "female", 130, "Boston,USA");
//外部访问受保护属性
//echo $jack->name."的年龄是:".$jack->age."<br />"; //Fatal error: Cannot access 【protected】 property Human::$age 禁止访问受保护属性
//外部访问受保护的方法
//$jack->html(); //请勿访问受保护方法
//外部检测一个受保护属性 总是返回false
echo $jack->addr; // Fatal error: Uncaught Error: Cannot access private property Human::$addr
私有和受保护的属性可以通过公有的方法去访问、上上个代码示例已经说明。
<?php
class Human {
public $name;
public $sex;
protected $age=24; //受保护属性
private $addr="USA"; //私有属性
public function __construct($name, $sex) {
$this->name = $name;
$this->sex = $sex;
}
private function walking() {
echo $this->name."正在散步";
}
protected function html() {
echo "我是html";
}
}
class Hu extends Human{
public function sayAge(){
echo $this->age;
}
public function sayAddr()
{
echo $this->addr;
}
}
//实例化对象
$jack = new Hu("Jack", "男人");
//print_r($jack); Hu Object ( [name] => Jack [sex] => 男人
// [age:protected] => 24
// [addr:Human:private] => USA
echo $jack->sayAge(); //公有方法访问受保护属性
echo $jack->sayAddr(); //子类是访问不到父类的私有属性
// //Notice: Undefined property: Hu::$addr
echo $jack->age; //在子类的内部是可以访问受保护的属性的
///外部无法访问受保护属性//Uncaught Error: Cannot access protected property Hu::$ag