1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程
序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三 个目标:重用性、灵活性和扩展性。为了实现整体
运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。2.什么是类,什么是对象,类和对象这间的关系
类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务
两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行
操作的一组服务组成。从更抽象 的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信
息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组 服务的封装体。客观世界是由对象和对象之间的联系组成的。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类.类描述了一组有相同特性(属性)
和相同行为(方法)的对象。3.什么是面向对象编程呢?
把每个独立的功能模块抽象成类形成 对象,由多个对象组成这个系统,这些对象之间都能够接收信息、处理数据和向其它对象发送
信息等等相互作用。就构成了面向对象的程序。4.如何抽象出一个类?
使用一个关键字class和后面加上一个你想要的类名以及加上一对大括号, 这样一个类的结构就定义出来了,只要在里面写代码就可
以了, 但是里面写什么? 能写什么?怎样写才是一个完整的类呢?上面讲过来,使用类是为了让它实例出对象来给我们用, 这就要
知道你想要的是什么样的对象了,像上面我们讲的一个装机配置单上写什么,你装出来的机子就有什么。比如说,一个人就是一个对
象,你怎么把一个你看好 的人推荐给你们领导呢?当然是越详细越好了:首先, 你会介绍这个人姓名、性别、年龄、身高、体重、电话、家庭住址等等。
然后,你要介绍这个人能做什么, 可以开车, 会说英语, 可以使用电脑等等5.如何实例化对象?
$对象名称 = new  类名称();对像在PHP里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,在运行的时候都要加载到内存中去用, 那么对
象在内存里面是怎么体现的呢?内存从罗辑上说大体上是分为4段, 栈空间段, 堆空间段,代码段, 初使化静态段, 程序里面不同
的声明放在不同的内存段里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1, 10, 100,1000,10000, 100000等等,在内存里面占用空间是等长的,都是64位4个字节。 那么数据长度不定长,而且占有空间很大的数据类型的数
据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。栈内存是可以直接存取的,而堆内存是不 可以直接存取的内存。对于
我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通
过对象名称就可以使用对象了。6.如何去使用对象中的成员
对象->属性 、对象->方法 形式访问7.特殊的引用“$this“的使用
现在我们知道了如何访问对象中的成员,是通过”对象->成员”的方式访问的,这是在对象的外部去访问对象中成员的形式, 那么如果
我想在对象的内部,让对象里的方法访问本对象的属性, 或是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的
所有的成员都要用对象来调用,包括对象的内部成员之间的调用,所以在PHP里面给 我提供了一个本对象的引用$this, 每个对象里面
都有一个对象的引用$this来代表这个对象,完成对象内部成员的调用, this的本意就是“这个”的意思,每个对象里面各自存在一个
$this分别代表对象8.构造方法__construct()与析构方法__destruct() 大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的
时候自动调用构造方法。构 造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5中的变化,以前的版
本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人用了,这样做的好处是可以使构 造函数独立
于类名,当类名发生改变时不需要改相应的构造函数名称了。为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP将搜
索一个php4中的写法,与类名相同名的构造方法。对象在内存中被销毁前调用析构函数, 一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数9.封装性(var与public,protected,private的关系)
prvate $age; // 私有的属性年龄
function setAge($age) // 为外部提供一个公有设置年龄的方法
{if ($age<0 || $age>130) // 在给属性赋值的时候,为了避免非法值设置给属性return;$this->age = $age;
}function getAge() // 为外部提供一个公有获取年龄的方法
{return($this->age);
}10.__set(),__get(),__isset(),__unset()四个方法的应用
总是把类的属性定义为private,这更符合现实的逻辑。但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个
函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”。1、__set(), __get() 是专门为类的私有属性(private、protected)设立的,对于类的公开(public)属性,外面是可以直接访问
与设置的(如:$p1->name),即不走__set(),__get()函数的!!!2、在PHP5.3及以后,上述魔术方法(__get(),__set(),__isset(),__unset() 等)提倡是 public 类型的,并且不是 static 方法,
否则会给出警告信息<?php
class A
{private $name = 'qianyunlai';public $old = '26';private function __get($name){echo $name, '<br />';return $this->$name;}
}$a = new A();
print_r($a->name);
?>输出:
( ! ) Warning: The magic method __get() must have public visibility and cannot be static in
D:\PHP\xampp\htdocs\discuz\discuzx3.0\123.php on line 6name
qianyunlai11.类的继承
class 类名 extends 类名{}
PHP和Java语言里面没有多继承,只有单继承,也就是说,一个类只能直接从一个类中继承数据, 这就是我们所说的单继承。12.重载新的方法(parent::)
PHP中的方法是不能重载的, 所谓的方法重载就是定义相同的方法名,通过“参数的个数“不同或“参数的类型“不 同,来访
问我们的相同方法名的不同方法。但是因为PHP是弱类型的语言, 所以在方法的参数中本身就可以接收不同类型的数据,又因
为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的。所以在PHP
里面没有方法重载。不能重载也就是在你的项目中不能定义相同方法名的方法。另外,因为PHP没有名子空间的概念,在同一个
页面和被包含的页面中不能定义相同名称的方法, 也不能定义和PHP给我提供的方法的方法重名,当然在同一个类中也不能定
义相同名称的方法。在子类这 个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以
通过两种方法实现在子类的方法中调用父类被覆盖的方法:构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会覆盖掉父类中
的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。
class Student extends Person
{var $school;    // 学生所在学校的属性function __construct($name, $sex, $age, $school){// 使用父类中的方法为原有的属性赋值parent::__construct($name, $sex, $age);$this->school = $school;}// 这个学生学习的方法function study(){echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习";}// 这个人可以说话的方法, 说出自己的属性function say(){parent::say();// 加上一点自己的功能echo "我的年龄是:" . $this->age . " 我在" . $this->school . "上学";}
}13.访问类型(public,protected,private)
public (公有的、默认的),protected (受保护的)和private (私有的)private     protected   public
同一个类中     √            √        √
类的子类中                  √        √
所有的外部成员                         √14.final关键字的应用
这个关键字只能用来定义类和定义方法, 不能使用final这个关键字来定义成员属性,因为final是常量的意思,
我们在PHP里定义常量使用的是define()函数,所以不能使用final来定义成员属性。使用final关键标记的类不能被继承,使用final关键标记的方法不能被子类覆盖15.static和const关键字的使用(self::const/static)
static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时
候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;const是一个定义常量的关键字,在PHP中定义常量使用的是“define()”这个函数,但是在类里面定义常量使用的是“const”这个关键字,(类内)self(代表这个静态属性所在的类)
(类外)(静态方属性所在的类)16.__toString()方法
“__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动调用的
“$p=new Person()“中,$p就是一个引用,我们不能使用echo 直接输出$p,这样会输出
“Catchable fatal error: Object of class Person could not be converted to string”这样的错误,
如果你在类里面定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用
了”__toString()”方法, 输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有
个返回值(return 语句)。<?php
// Declare a simple class
class TestClass
{public $foo;public function __construct($foo){$this->foo = $foo;}// 定义一个__toString方法,返加一个成员属性$foopublic function __toString(){return $this->foo;}
}$class = new TestClass('Hello');// 直接输出对象
echo $class;
?>17.克隆对象__clone()方法在PHP4中我们使用“clone”这个关键字克隆对象;<?
class Person
{// 下面是人的成员属性var $name;  // 人的名子var $sex;   // 人的性别var $age;   // 人的年龄// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值function __construct($name = "", $sex = "", $age = ""){$this->name = $name;$this->sex = $sex;$this->age = $age;}// 这个人可以说话的方法,说出自己的属性function say(){echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";}
}$p1 = new Person("张三", "男", 20);// 使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。
$p2=clone $p1;
$p2->say();
?>PHP4定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对
象拥有相同属 性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法,“__clone()”
方法可以没有参数,它自 动包含$this和$that两个指针,$this指向复本,而$that指向原本;<?
class Person
{// 下面是人的成员属性var $name;  // 人的名子var $sex;   // 人的性别var $age;   // 人的年龄// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值function __construct($name = "", $sex = "", $age = ""){$this->name = $name;$this->sex = $sex;$this->age = $age;}// 这个人可以说话的方法, 说出自己的属性function say(){echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";}// 对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法function __clone(){// $this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。$this->name = "我是假的 $that->name";$this->age = 30;}
}$p1 = new Person("张三", "男", 20);
$p2 = clone $p1;
$p1->say();
$p2->say();
?>18.__call()处理调用错误
下面我们加上“__call()”方法,这个方法有2个参数,第一个参数为调用不存在的方法过程中,自动调用__call()方法时,
把这个不存在的方法的方法名传给第一个参数,第二个参数则是把这个方法的多个参数以数组的形式传进来。<?php
//这是一个测试的类,里面没有属性和方法
class Test
{// 调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数function __call($function_name, $args){print "你所调用的函数:$function_name(参数:";print_r($args);echo ")不存在!<br>";}
}// 产生一个Test类的对象
$test=new Test();// 调用对象里不存在的方法
$test->demo("one", "two", "three");// 程序不会退出可以执行到这里
echo "this is a test<br>";
?>19.抽象方法和抽象类(abstract)
定义抽象类就相当于定义了一种规范,这种规范要求子类去遵守,子类继承抽象类之后,把抽象类里面的
抽象方法按 照子类的需要实现。<?
abstract class Demo
{var $test;abstract function fun1();abstract function fun2();function fun3(){...}
}$demo = new Demo(); // 抽象类不能产生实例对象,所以这样做是错的,实例化对象交给子类class Test extends Demo
{function fun1(){...}function fun2(){...}
}$test = new Test(); // 子类可以实例化对象,因为实现了父类中所有抽象方法
?>20.PHP5接口技术(interface)
接口是一种特殊的抽象类,抽象类又是一种特殊的类,所以接口也是一种特殊的类,为 什么说接口是一种特殊
的抽象类呢?如果一个抽象类里面的所有的方法都是抽象方法,那么我们就换一种声明方法使用“接口”;也就
是说接口里面所有的方法必须 都是声明为抽象方法,另外接口里面不能声明变量(但可声明常量constant),而
且接口里面所有的成员都是public权限的。PHP中不仅一个类可以实现多个接口,也可以在继承一个类的同时实现多个接口, 一定要先继承类再去实现接口;<?php
// 使用extends继承一个类,使用implements实现多个接口
class Four extends 类名一 implemtns 接口一, 接口二, ...
{// 所有接口中的方法都要实现才可以实例化对象...
}
?>21.多态的应用
所谓多态性是指一段程序能够处理多种类型对象的能力
比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不同的员工或是不同职位的员工,
都是通过这个方法发放的,但是所发的工资都是不相同的。所以同一个发工资的方法就出现了多种形态22.把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,
再还原为原来的对象,这个过程称之为串行化
__sleep()函数不接受任何参数, 但返回一个数组
__wakeup()方法做一些对象醒来就要做的动作。<?
class Person
{// 下面是人的成员属性var $name;  // 人的名子var $sex;   // 人的性别var $age;   // 人的年龄// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值function __construct($name = "", $sex = "", $age = ""){$this->name = $name;$this->sex = $sex;$this->age = $age;}// 这个人可以说话的方法, 说出自己的属性function say(){echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";}// 指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sexfunction __sleep(){$arr = array("name", "age"); // 此时,属性$sex将被删除!!!return($arr);}// 重新生成对象时,并重新赋值$age为40function __wakeup(){$this->age = 40;}
}$p1 = new Person("张三", "男", 20);// 把一个对象串行化,返一个字符串,调用了__sleep()方法,忽略没在数组中的属性$sex
$p1_string = serialize($p1);
echo $p1_string . "<br>"; // 串行化的字符串我们通常不去解析$p2 = unserialize($p1_string); // 反串行化形成对象$p2重新赋值$age为40
$p2->say();
?>23.自动加载类 __autoload()函数
_autoload() 是专门为 类的不存在 而设计的!!!很多框架利用这个函数,实现 类文件的自动加载 !!!

PHP面向对象-----(总体学习路线)相关推荐

  1. python自学攻略-大牛整理!Python学习方法和学习路线,看完茅塞顿开!

    原标题:大牛整理!Python学习方法和学习路线,看完茅塞顿开! Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团 ...

  2. 2020年最新前端学习路线

    这段日子在 B 站上收到小伙伴最多的要求就是出一个前端学习路线,我能够充分的感受到大家抓耳挠腮加挠墙的迷茫~所以在这里给大家总结了一套前端学习路线.先从初级前端工程师所需的技能开始,然后一路升级到高级 ...

  3. 嵌入式小白到大神学习全攻略(学习路线+课程+学习书籍+练习项目)

    文章较长,希望耐心阅读,读完相信会对你的学习一定有帮助~ 嵌入式工程师需要掌握的内容非常广泛,嵌入式可以说是当下最有前途的IT应用领域,小到电子词典.手机,大到航空航天设备都是典型的嵌入式系统,因此, ...

  4. python爬虫架构师之路_一位资深 架构师大牛给予Java技术提升的学习路线建议

    一位资深 架构师大牛给予Java技术提升的学习路线建议 对于工作多年的程序员而言,日后的职业发展无非是继续专精技术.转型管理和晋升架构师三种选择. 架构师在一家公司有多重要.优秀架构师需要具备怎样的素 ...

  5. python学习图解_大牛整理!Python学习方法和学习路线,看完茅塞顿开!

    原标题:大牛整理!Python学习方法和学习路线,看完茅塞顿开! Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团 ...

  6. python学习-大牛整理!Python学习方法和学习路线,看完茅塞顿开!

    原标题:大牛整理!Python学习方法和学习路线,看完茅塞顿开! Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团 ...

  7. C/C++开发进阶的学习路线

    这一阶段的目标才是达到C/C++软件工程师开发行业的基本要求,这个阶段是走向C/C++开发的进阶之路,更是一个让自己找份薪水比较体面的工作的筹码. C/C++开发进阶的学习路线 1.C++进阶之STL ...

  8. 资深程序员骆昊:Python从新手到大师,100天完整学习路线

    Python - 100天从新手到大师 摘要:最近后台有些小伙伴在问我Python入门的问题,我推荐这个学习路线资料,可能你们有些已经在使用它,的确它是我见过最全的.最富有逻辑体系的Python技术栈 ...

  9. 熬夜肝出 3w 字测试开发学习路线

    本文将从薪水,职业规划,测试理论基础,自动化测试基础,常用自动化框架,计算机基础及 Python 高频面试题,测试相关高频面试题出发,详细内容如下,希望能对大家有所帮助. 薪水 我把它放在最前面,让大 ...

最新文章

  1. 航天智慧物流线上预选赛-成绩公布
  2. java和python工资-python为什么叫爬虫 python工资高还是java的高
  3. 雷达多普勒频率计算公式_非接触式雷达在线测流系统是由什么组成的?
  4. html中响应式字体怎么写,如何实现网页中字体响应式
  5. 中文(英译) 爱情一句话哲理
  6. 开始位置 环状图_水星轨道发现千万公里环状结构,或将发现新的行星环
  7. vfp 界面_VFP之老树新花
  8. nginx 启动报错 “/var/run/nginx/nginx.pid failed” 解决方法
  9. 极域电子书包课堂管理系统怎么控屏_极域电子教室使用说明
  10. Java可以加速播放的播放器,基于live555的rtsp播放器之十二:使用soundtouch加速音频播放...
  11. 选择云盾抗ddos防火墙,信息安全有保障
  12. Netflix Conductor流程系统(二):官方样例搭建
  13. 苹果摄像头黑屏_报道称苹果已将折叠 iPhone 送往测试/苹果官网上线送份好礼,送到心里页面/iPhone 12 mini 拆解报告公布...
  14. 【金融案例分析03】深度解读:光大证券乌龙指事件是怎么回事?(套利交易、基金背后的金融原理,事件的过程与定性)
  15. shell脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别
  16. mysql中gender要用什么类型,如何选择合适的MySQL数据类型
  17. App渗透中常见的加密与解密
  18. 手机端APP活体真活人检测扫描人脸识别SDK之张嘴摇头眨眼点头确认真人非图片...
  19. 自我鉴定200字大专生计算机专业,大专毕业自我鉴定200字
  20. 【LeetCode每日一题】810. 黑板异或游戏

热门文章

  1. 5款提高工作效率的无广告软件
  2. android 铃声设置流程讲解
  3. 【CFW】浏览器[自动]选择是否走代理,桌面软件不走代理
  4. 【AIOQuant量化交易框架】第1讲-高频交易介绍
  5. C# Assembly说明
  6. 如何解决对象不支持此属性或方法
  7. 宇宙的起源--演讲全文(斯蒂芬·霍金)
  8. 从菜鸟到顶级程序员的常用软件
  9. Ganglia 监控
  10. forever 使用