OOP编程简称面向对象编程,面向对象编程有三大特性,封装,继承,多态,利用这三大特性来实现代码的设计与实现,这个编程思维非常的接近人的思维了,就好像在公司里,老板说要做件事情,把每个地方做什么,给设计出来,然后员工实现出来。只不过这是用在编程里面,道理是一样的。如果想学会面向对象编程,就必须了解好,封装,继承,多态,下面通过案例带大家了解一下。
继承可以想象成,子承父业,继承了父业之后,可以重新改版业务,扩展业务,都行。在编程里也一样,总共分为,继承,重写,扩展
简单的继承,就是把父类的中的属性和方法,给复制过来。
实例:
// 父类:基类
class Fruits
{
protected $name = '香蕉';
protected $source = '泰国';
// 方法
public function message()
{
return "名称:{$this->name}"."产地为:{$this->source}";
}
}
// 子类:扩展类
class Banana extends Fruits
{
}
// 客户端
$banana = new Banana();
echo $banana->message();
输出:名称:香蕉产地为:泰国
通过输出我们可以看到,子类并没有一句代码,仅仅是继承了父类的方法,这就是基本的继承,下面来说一下扩展
重写就是将父类中的属性进行更新,但是这个属性在子类中,并不在父类中。
实例:
// 父类:基类
class Fruits
{
protected $name = '香蕉';
protected $source = '泰国';
// 方法
public function message()
{
return "名称:{$this->name}"."产地为:{$this->source}";
}
}
// 子类:扩展类
class Banana extends Fruits
{
// 属性重写
protected $name = '葡萄';
protected $source = '中国';
protected $weight = '1.9';
// 方法重写
public function message()
{
return "名称:{$this->name}"."产地为:{$this->source}"."重量为:{$this->weight}";
}
}
// 客户端
$banana = new Banana();
echo $banana->message();
输出:
名称:葡萄产地为:中国重量为:1.9
同样的代码,我们只是在子类中,将父类的属性与方法进行了重写,结果就不一样
扩展顾名思义,就是在父类的基础上,进行扩建,不对原来的属性与方法进行更改
示例:
// 父类:基类
class Fruits
{
protected $name = '香蕉';
protected $source = '泰国';
// 方法
public function message()
{
return "名称:{$this->name}"."产地为:{$this->source}";
}
}
// 子类:扩展类
class Banana extends Fruits
{
protected $name = '葡萄';
protected $source = '中国';
protected $weight = '1.9';
// 属性扩展
protected $color = 'yellow';
public function message()
{
return "名称:{$this->name}"."产地为:{$this->source}"."重量为:{$this->weight}";
}
// 方法扩展
public function appearance()
{
return "颜色:{$this->color}";
}
}
// 客户端
$banana = new Banana();
echo $banana->message();
echo $banana->appearance();
输出名称:葡萄产地为:中国重量为:1.9颜色:yellow
可以看到,通过扩写把父类中的功能进行了增加。
前面我们说过,老板就是告诉员工,这个地方怎么做,那个地方怎么做,并没有执行,都是一些抽象的东西,比如,老板说这个地方要优化一下,你去改一下,这就是一句抽象的话,因为老板并没有告诉你要怎么做,员工知道要优化后,就开始着手敲代码,这就是实现。设计与实现始终是面向对象的核心,不是单纯的敲代码。
既然是抽象,就不会有方法的的实现,以及属性的值。
示例:
// 设计类
abstract class Fruits
{
protected $name;
protected $source;
protected $weight;
// 方法
abstract protected function message();
// 抽象的方法是没有方法体的
}
// 实现类
class Banana extends Fruits
{
protected $name = '葡萄';
protected $source = '中国';
protected $weight = '1.9';
protected function message()
{
// 实现抽象类,必须将抽象方法实现
return "名称:{$this->name}"."产地为:{$this->source}"."重量为:{$this->weight}";
}
}
// 最终工作类
class work1 extends Banana
{
public function printf()
{
return parent::message();
}
}
// 客户端
$banana = new work1();
echo $banana->printf();
输出名称:葡萄产地为:中国重量为:1.9
通过abstract
来声明,就可以将一个类变为抽象类,也就是老板说的话,通过实现类来写代码,把老板说的话实现出来,非常巧妙。
接口就像两个不同的东西,通过接口结合在一起,这个在后面的实战中可能会用的多,目前只能知道一些基本语法。
示例
interface iUser
{
// 接口常量
const NATION = '俄罗斯';
public static function write();
// 构造方法
}
// 工作类实现接口
class User implements iUser
{
protected static $name = '赵忠祥';
// 接口中的抽象方法,必须在工作类中实现
public static function write()
{
return self::$name.'的国籍是:'.iUser::NATION;
}
}
// 客户端
// 访问接口常量,与访问常量一样。
echo iUser::NATION;
// echo User::write();
$user = new User();
echo $user->write();
输出:俄罗斯赵忠祥的国籍是:俄罗斯
通过老师的讲解,使我对面向对象有了更深的理解,以前只认为面向对象是为了实现代码复用,其实更重要的就是设计与实现,通过设计与实现来实现抽象到具体,这一过程,面向对象编程如果在实战中能运用好的话,就可以避免很多麻烦,比如一股脑的敲代码,对整体的构造,没有清晰的思路,写到哪就到哪,就永远不会进步。