首先,在解释面向对象之前先解释下什么是面向对象?

[面向对象]
1、什么是类?
 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念
2、什么是对象?
从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体

所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题。

下面我们再来细说下面向对象的三大特征:继承/封装/多态

一、继承

在PHP中我们主要通关Extends关键字来实现继承   ->class Student extends Person{}

下面是几个比较重要的注意事项:

①子类只能继承父类的非私有属性。
②子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用该属性;
③PHP只能单继承,不支持一个类继承多个类。但是一个类可以进行多层继承(即A继承于B,而C又继承于A,C通过A间接继承了B)

二、封装

类实现封装是为了不让外面的类随意的修改一个类的成员变量,所以在定义一个类的成员的时候,我们使用private关键字设置这个成员的访问权限

只能被这个类的其他成员方法调用,而不能被其他类中的方法调用,即通过本类中提供的方法来访问本类中的私有属性。

①所以在该类中我们会提供一个访问私有属性的方法

②然后我们一般会定义两个方法来实现对一个变量的操作,即:get()与set()方法。

代码示例如下:

class Person{
private $name;
private $age; public function __construct($name,$age){
$this->name = $name;
$this->age = $age;
}
function setAge($age){
if($age>=0&&$age<=120){
$this->age = $age;
}else{
error_log("年龄设置有误!");
}
} function getAge(){
return $this->age;
}
public function say(){
echo "我叫{$this->name},我今年{$this->age}岁了";
} function __get($name){
switch ($name) {
case 'name':
return $this ->$name."这是读取时加的文字";
case 'age':
return "0".$this ->$name;
default:
return $this ->$name;
} }
function __set($key,$value){ if($key=="name"){
$this->$key = $value."这是设置时加的文字<br>";
}else{
$this->$key = $value;
}
}
function __isset($name){
return isset($this->$name);
} function __unset($name){
if($name=="age"){
return;
}
unset($this->$name);
}
} $zhangsan = new Person("zhangsan",14);
$zhangsan->setAge(12);
echo $zhangsan->getAge()."<br>";
var_dump(isset($zhangsan->name));
unset($zhangsan->age);
echo $zhangsan->age;

三、多态

什么是多态?

一个类,被多个子类继承,如果这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态。(同一个类的不同子类表现出不同的形态)

那么我们如何来实现多态呢?

子类继承父类 ->子类重写父类方法 ->父类引用指向子类对象

abstract class Person{        注:父类使用abstract关键字修饰
abstract function say();
}

class Chinese extends Person{    注:子类重写父类方法
function say(){
echo "我是中国人<br>";
}
}
class English extends Person{    注:子类重写父类方法
function say(){
echo "我是英国人";
}
}

$zhangsan = new Chinese();
$zhangsan->say();
$z = new English();
$z->say();
Person $p = new Chinese();   注:父类引用指向子类对象

上述代码中,两个子类都是继承自同一父类,但因为都重写了父类的方法,表现出了不同的形态

 

* 四、单例设计模式

单例模式也叫单态模式
可以保证一个类只能有一个对象实例
实现要点:
①构造函数私有化,不允许使用new关键字创建对象。
②对外提供获取对象的方法,在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回
③实例对象的属性以及获取对象的方法必须都是静态的。
④之后,创建对象只能使用我们提供的静态方法。

示例代码如下:

class Singleton{
static public $Single = null;
private function __construct(){}
static function getSingle(){
if(!self::$Single){
self::$Single = new Singleton();//self代指类名 new Singleton()和newself()是完全一样的
} return self::$Single;
} function __destruct(){
echo "我被销毁了<br>";
}
}
$s1 = Singleton::getSingle();
$s1 = Singleton::getSingle();
$s1 = Singleton::getSingle();

最新文章

  1. stl-基本知识
  2. [物理学与PDEs]第4章 反应流体力学
  3. 【POJ】3523 The Morning after Halloween
  4. 分享一个自己写的基于TP的关系模型(四)
  5. js 获取10个不重复随机数
  6. 在一台电脑上运行两个或两个以上的tomcat
  7. Exchange 2010邮件服务器的搭建和部署
  8. 通俗易懂的来讲讲js的函数执行上下文
  9. STREAMING HIVE流过滤 官网例子 注意中间用的py脚本
  10. python时间日期格式化和反格式化
  11. Learning-Python【3】:Python中的基本运算符
  12. fb发布打包外部资源
  13. JAVA 项目中使用 H2 数据库
  14. C语言 &#183; 生物芯片
  15. android动态设置边框颜色
  16. 读写JSON作配置文件
  17. 使用post向webservice发送请求,并且返回值
  18. 关于对afx_msg的解释-----来源百度百科
  19. Can not find -lXXXX
  20. 第24天:js-函数变量声明提升

热门文章

  1. par函数bty参数-控制绘图边框
  2. 弹窗插件zDialog使用教程
  3. MathType公式编辑器快捷键操作
  4. OpenCV学习:Windows+VS2010+OpenCV配置
  5. MAC快捷键使用大全
  6. Java精选笔记_JDBC
  7. EF--CodeFirst
  8. /etc/hosts
  9. 开源项目源码解析-PhotoView 源码解析
  10. linux IP 设置