1、封装
首先先介绍一个抽象的概念 抽象:
我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出 来形成一个物理模型(模板)。这种研究问题的方法称为抽象。 那么什么是封装呢?
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部 分只有通过被授权的操作(成员方法),才能对数据进行操作。
上边概念中我标蓝的部分中提到了封装时的数据保护和方法的授权,因此,在彻底了解 封装之前先说一下访问控制修饰符。
public
表示全局,类内部、外部和子类都可以访问;
protected
表示受保护的,只有本类或子类可以访问;
private
表示私有的,只有本类内部可以使用;
php
中对象的成员变量的访问属性不能是默认的
public 表示全局,类内部、外部和子类都可以访问;
protected 表示受保护的,只有本类或
子类可以访问;
private 表示私有的,只有本类内部可以使用;
php中对象的成员变量的访问属性不能是默认的
比如: class Person{ $name=‘abc’; } $p1=new Person();是错误的!!
②用接口实现多态
class Person{
public $name;
public $age;
private $salary;
public function Person($name,$age,$salary){ //带参数的函数
$this->name=$name;
$this->age=$age;
$this->salary=$salary;
}
public function getSalary(){
return $this->salary;
}
}
$p1=new Person("某某",10000);
echo '工资='.$p1->getSalary();
下边我把php的魔术函数给大家介绍一下:
魔术函数:
1。__construct()
实例化对象时被调用,
当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
2。__destruct()
当删除一个对象或对象操作终止时被调用。
3。__call()
对象调用某个方法,
若方法存在,则直接调用;
若不存在,则会去调用__call函数。
4。__get()
读取一个对象的属性时,
若属性存在,则直接返回属性值; 若不存在,则会调用__get函数。
5。__set()
设置一个对象的属性时, 若属性存在,则直接赋值; 若不存在,则会调用__set函数。
6。__toString()
打印一个对象的时被调用。如echo $obj;或print $obj;
7。__clone()
克隆对象时被调用。如:$t=new Test();$t1=clone $t;
8。__sleep()
serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9。__wakeup()
unserialize时被调用,做些对象的初始化工作。
10。__isset()
检测一个对象的属性是否存在时被调用。如:isset($c->name)。
11。__unset()
unset一个对象的属性时被调用。如:unset($c->name)。
12。__set_state()
调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
13。__autoload()
实例化一个对象时,如果对应的类不存在,则该方法被调用。
魔术常量:
1。__LINE__
返回文件中的当前行号。
2。__FILE__
返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
3。__FUNCTION__
返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
4。__CLASS__
返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
5。__METHOD__
返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
2、继承
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,
所有的子类不需要重新定义这些属性和方法,只需要通过class 子类名 extends 父类名{}这样,子类就会自动拥有父类定义的属性和方法。
方法重写/方法覆盖(override)
既然子类可以继承父类的属性和方法,这样可以提高代码的复用性,子类可以把父类中继承过来的方法进行重写,便于扩展。
简单的说:方法重写就是子类有一个方法,和父类的某个方法的名称、参数个数一样,那么我们就说子类的这个方法重写了
提示:
如果在子类中需要访问其父类的方法(public/protected属性),可以使用父类::方法名 或者 parent::方法名 来完成。
<?php
class parents{
public function test(){
echo "我是父类的方法";
}
}
class child extends parents{ //父类中只有public 、protected子类才可继承
public function test(){
echo "我是继承父类的方法,改写后的";
echo '*******s';
parent::test();
}
}
$child = new child();
$child->test();
//这里输出我是继承父类的方法,改写后的*******s我是父类的方法
//所以这里的重写覆盖并没有把父类的给覆盖,而是他继承的那个
?>
关于方法重写细节讨论
1. 要实现重写,要求 子类的那个方法的名字和参数列表个数一摸一样,但是并不
要求参数的名称一样.
2. 如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法
名(参数..) , 父类名::方法名(参数...)
3. 在实现方法覆盖的时候,访问修饰符可以不一样 //但是必须满足: 子类的访
问范围>=父类的访问范围
3、多态
方法重载(overload)
“重载”是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
①用继承实现多态
<?php
/**
* Created by PhpStorm.
* User: Jing
* Date: 2016/7/18
* Time: 9:41
*/
Class father{
public $name;
public function getWeight(){
return "60kg";
}
public function getName(){
$this->name="zhangsan";
}
}
class son extends father{
public function getName()
{
echo "我是接口实现的多态,我继承了父类的方法和属性";
$this->name="lisi";//输出放入lisi是son继承father后改写的
}
}
$mySon=new son();
$mySon->getName();
echo $mySon->getWeight();
//输出放入lisi是son继承father后改写的
echo $mySon->name;
②用接口实现多态
<?php
interface mum{
public function getName();
public function setName();
}
class son implements mum{
public function getName(){
return "lisa";
}
public function setName(){
echo "我是接口实现的多态";
return "duoli";
}
}
$mySon=new son();
echo $mySon->getName();
echo $mySon->setName();