php一种面向对象的语言,那么什么是面向对象呢?

传统的面向过程的编程思想:

相信很多人第一次接触编程都是c语言,c语言就是非常典型的面向过程的编程语言,将要实现的功能描述为一个从开始到结束的连续的“步骤(过程)”。依次逐步完成这些步骤。如果步骤较大,又可以将该步骤再次细分为子步骤,以此类推。
程序从头开始执行一直到结尾并得到所需结果。
例子:完成来传智“报名学习”这件事,可以这样来实现:
第一步,学生提出要报名,并提供姓名和照片
第二步,咨询老师接收照片并登记学生姓名
第三步,学生缴费(付款到学校账号)并获得缴费凭证
第四步,咨询老师验证凭证并分配班级
第五步,最终结果为:报名完成,学生可以在规定的时间到规定的班级(教室)上课,数据库中就有了该学生的信息。

现代的面向对象的编程思想:

将要实现的功能描述为一个“对象/物体”完成的任务——现实中也是如此:功能的实现都是依赖于一个实体的“行动/操作/动作”。完成该最终功能的过程中需要实现其他中间功能(过程),则再去调用其它对象(或也可能是自己本身)来实现该中间功能。
整个系统的完成(功能的实现)看作是一个一个对象在发挥其各自的“能力”并在内部进行协调有序的调用过程。
例子:完成来传智“报名学习”这件事,可以这样来处理:学生对象:有姓名有照片,有所属班级,能“提出报名”,能“缴费”,咨询老师对象:能接收照片并登记姓名,能分配班级。班级对象:有班号,有开班日期,有教室。

面向对象基本概念:

类与对象:类是描述一类事物的一个总称,是具有相同特征特性的该类事物的一个通用名字(称呼);比如人就是一个类(人类),狗也是一个类(狗类),它们又属于一个更大的类(哺乳类),桌子,手机,书都是一个类;
对象是一个明确的具体的“物体”,是某个类中的一个“实物”(相对来说,类就是一种抽象的泛称)。对象离不开类,或者说,对象一定隶属于某个类——有类才有对象,先有类再有对象。
比如“黄晓明”就是“人”这个类的一个具体对象,“阿黄”是“狗”这个类的一个具体对象。
一个类决定了一个对象所具有的所有特征特性信息,比如我是人类,则我有:姓名,性别,年龄,我还能吃饭,走路,说话。
一个对象的所有特征特性信息,都是由其所属的类决定的,但每个对象又很有可能有自己不同的特征特性信息,比如有个对象的名字叫吴六奇,性别男,会写程序,另一个对象可能叫章子怡,性别女,会演戏。
语法上,一个类内部可以具有自己的“变量”和“函数”,但此时在技术术语上就对应地称为“属性”和“方法”。一个类也可以有自己的常量。这些属性,方法和常量就都称为“类”的“成员”。

对象的创建:

就是由一个类“创建”出一个具体的“物体”——专业说法就是对象。创建对象的语法可以有:
new 类名();
new 变量名(); //该变量的内容是一个表示类名的字符串。
new 对象名();//创建该对象所属类的一个新对象
new self; //用于在类的方法内部创建一个该类对象。
类名::getNew();//定义类的一个静态方法用于获取该类的一个对象

对象的使用:

要么使用其属性,要么使用其方法。使用属性,就可以当作一个变量看待。使用方法,就可以当作一个函数看待。
一个类中能且只能包含如下3种成员(代码):变量(称为属性),函数(称为方法),常量(称为类常量)。

一般属性:

属性就是定义在类中的变量,需要使用public或var来修饰(定义),也可以使用protected或private来修饰(见后续知识)。
定义的时候可以不赋值,也可以赋(初)值,但只能是一个“直接值”(常量值)或常量,不能是变量值或计算值或函数调用返回值等。

属性的使用形式:

对象名->属性名;
属性是可读可写的(可取值赋值)。

一般方法:

方法就是定义在类中的函数,但函数前可以使用public,protected, private修饰,也可以省略。
但该方法的调用(使用)不能独立进行,而是需要通过对象来调用。
方法中$this关键字具有特定含义:表示调用该方法的对象。
获取$this的所属类:get_class($this)

静态属性:

一个仅仅隶属于(依附于)类的属性,其是通过类名直接来取用的。

定义形式:

static $静态属性名 [ = 初值];//访问修饰符省略则默认为public,初值也应该是直接值或常量
使用形式:类名::$静态属性名;//可取值可赋值;

静态方法:

一个仅仅隶属于(依附于)类的方法,其是通过类名直接调用的(不过新版php已经可以使用该类的对象名来调用了)

定义形式:
[访问修饰符] static function $静态方法名(…){ …… }

使用形式:

类名::静态方法名(…);其中类名也可以用该类的对象名,一个内容为该类名的字符串变量名,self等来代替。

self关键字:

用在方法中,表示该方法所在的类。

static关键字:
代替self关键字的位置,除了具有self作用外,还具有更灵活的作用,那就是所谓“后期静态绑定”。注意:$this在静态方法中不能使用,静态方法中不应调用非静态方法。

类常量:

一个仅仅隶属于(依附于)类的常量,其是通过类名直接来取用的(不过新版php已经可以使用该类的对象名来调用了)

定义形式:

const 常量名 = 初值;//必须赋初值

使用形式:

类名::常量名;其中类名也可以用该类的对象名,一个内容为该类名的字符串变量名,self等来代替。

构造方法(函数):

构造方法是一个类在进行实例化(new一个对象出来)的时候,会首先自动调用的方法。
构造方法适用于创建对象时(使用对象前)对该对象做一些初始化工作。
定义形式:[访问修饰符] function __construct(...){ ...... };//访问修饰符通常总是需要public(或省略)。
调用形式:实际上,没有直接的调用形式,而是在new一个对象的时候就调用了:new C1("小花",18,"女");
如果一个类中定义了构造方法,则实例化该类时就会调用该方法,且实例化时的参数需要跟构造方法的参数匹配。
如果一个类中没有定义构造方法,则会自动调用其父类的构造方法(如果有),则实例化时的参数需跟父类的构造方法的参数匹配。
也可以在当前类的构造方法中调用父类的构造方法:parent::__construct();

析构方法(函数):

析构方法是在一个对象被销毁的时候会自动调用(执行)的方法;对象销毁的几种情况:
脚本程序运行结束,自动销毁;
明确地unset()一个对象变量,则被销毁;
改变对象变量的值,被销毁;
析构方法适用于销毁对象时对对象中使用的一些资源进行清理(销毁)——不过实际上现代PHP已经内具了垃圾回收机制,一般无需清理。。
定义形式:function __destruct(){ ...... };//注意:只能是public的,且不能有参数
调用形式:无需在代码中手工调用,而是在代码运行结束时自动被调用(执行)。
如果一个类中定义了析构方法,则销毁对象时就会调用该方法。
如果一个类中没有定义析构方法,则销毁对象时就会调用其父类的析构方法(如果有)

类的继承:

基本含义:类是用来描述现实世界中同一种事物的共有特性的抽象模型。但现实世界中,不同种类的事物之间有往往有一些上下级或大小范围的关系。比如,动物是一个“类”,具有某些特性。但脊椎动物也是一个类,也具有一些特性,且同时具有动物类的所有特性。哺乳动物还是一个类,具有一些特性,并同时具有脊椎动物的所有特性。如此等等,则面向对象编程中,我们定义的类也同样可以具有类似的关系特征,这就是类的继承。
**基本语法:**extends
**基本概念:**
**继承:**一个类从另一个已有的类获得其特性,称为继承。
**派生:**从一个已有的类产生一个新的类,称为派生。
**父类/子类:**已有类为父类,新建类为子类。
**单继承:**一个类只能从一个上级类继承其特性信息。PHP和大多数面向对象的语言都是单继承模式。C++是多继承。
**扩展:**在子类中再来定义自己的一些新的特有的特性信息(属性,方法和常量)。没有扩展,继承也就没有意义了。

访问控制修饰符:

public公共的:在所有位置都可访问(使用)。
protected受保护的:只能再该类内部和该类的子类或父类中访问(使用)。
private私有的:只能在该类内部访问(使用)。
parent关键字:在类的内部用来表示(代表)该类的父类。可以用来访问父类的属性或方法或常量。

构造和析构方法中的调用上级同样方法的问题:

子类中没有定义构造方法时,会自动调用父类的构造方法。因此实例化子类时,需按照父类的构造方法的形式进行。
子类定义了自己的构造方法,则不会自动调用父类的构造方法,但可以手动调用:parent::__construct();
子类中没有定义析构方法时,会自动调用父类的析构方法。
子类定义了自己的析构方法,则不会自动调用父类的析构方法,但可以手动调用:parent::__destruct()

重写override

**什么是重写?**重写又叫“覆盖”,就是将从父类继承下来的属性或方法重新定义。只有保护的或公有的属性或方法能够被覆盖。
**为什么要重写?**因为父类的某个属性可能对于子类来说不够具体或详细,子类想要同样特性或功能的更准确或详细信息。
**重写的基本要求:**访问控制权限,方法的参数形式。
**私有属性和私有方法的重写问题:**私有属性和方法都不能覆盖,但其实子类可以定义跟父类私有的同名属性或方法。只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。
**构造方法的重写问题:**构造方法不但可以像其他普通方法一样重写,而且,比普通方法更宽松:重写的时候参数可以不一致。
**最终类final class:**
**最终方法final method:**

设计模式:

**工厂模式:**一种专门用于“生产”其他各种类的对象的一个类
**单例模式:**一种只能从中实例化出来一个对象的类

类的“扩大化”技术:

**抽象类,抽象方法:**
一个类可以使用关键字abstract声明为抽象类;抽象类是不能实例化的类,只用作其他类的父类。
一个方法可以使用关键字abstract声明为抽象方法;抽象方法只需要声明方法头,不需要大括号部分的方法体。
**一个类中有抽象方法,则该类必须声明为抽象类。**
子类继承自一个抽象类,则子类必须实现父类中的所有抽象方法,除非子类也继续作为抽象类。
子类实现抽象父类的方法时,访问控制修饰符的范围不能降低,且方法的参数也须一致。

重载技术overloading:

**属性重载:**__set(), __get(), __isset(), __unset()
**方法重载:**__call(), __callstatic();

接口interface:

**什么是接口?
为什么需要接口?
接口的定义形式:**
**接口的实现:**使用接口被称为接口的“实现”(implements),其实就是类似“继承”
**接口的多实现:
接口常量:
接口继承:
有关类或对象的其他相关技术:**
**类的自动加载:**__autoload(), spl_autoload_register();
**对象的复制(克隆):
对象的遍历:
PHP内置标准类:
对象的类型转换:** 将得到一个标准类stdClass的对象
**对象转换为对象:**没有变化;
**数组转换为对象**:数组的键名当作属性名,值为对应值;
**null转换为对象:**空对象;
**其他标量数据转换为对象:**属性名为固定的“scalar”,值为该变量的值
**类型约束:**可以对函数(或方法)的参数设定必须使用的类型。只能对对象,接口,数组进行约束,如下所示:
function f1(类名 $p1){....}:要求该参数只能使用该类的对象;
function f1(接口名 $p1){....}:要求该参数只能使用实现该接口的对象;
function f1(array $p1){....}:要求该参数只能使用数组;
其他的类型不能,比如:function f1(int $p1){...}, function f1(string $p1){...}都是错的。
**与类有关的魔术常量:**__CLASS__, __METHOD__
**与类有关的其他魔术方法:**
**已学过的魔术方法:**__construct, __destruct, __set(), __get(), __isset(), __unset(), __call(), __callstatic()
__sleep()和__wakeup(): 序列化操作的时候,会先调用__sleep()方法,反序列化操作的时候会先调用__wakeup()方法。
__tostring():将对象当作字符串来使用的时候,会自动调用该方法,以此来作为对象转换为字符串的结果数据。
__invoke():将对象当作函数来使用的时候,会自动调用该方法。
*与类有关的系统函数:*class_exists(), interface_exists(), get_class(),get_parent_class(), get_class_methods(), get_class_vars(), get_declared_classes()
*与对象有关的系统函数:*is_object(),get_object_vars()
*与类有关的运算符:*new,instanceof
**面向对象编程思想的3个特征:封装,继承,多态。**

MVC框架与应用:

项目开发流程介绍
显示与逻辑相分离
原始做法:显示与逻辑混合
高级做法:显示与逻辑分离
实现方式:模板技术
MVC框架原理
MVC思想简单演示1
数据生产文件
数据显示文件
逻辑(功能)控制文件
MVC思想框架结构图
MVC思想演示(常规带数据库操作)
视图文件
模型文件
控制器文件
**模型层(Model)的典型实现**
功能:用于处理数据的存取操作,比如表的增删改查。
模型层的典型代码模式
控制器调用模型方法以获取数据
基础模型类
实现模型类的单例(模型工厂)
整个模型层的类库结构图
**控制器层(Controller)的典型实现**
控制器的作用
获取请求数据
调用模型获取数据
载入视图文件以显示数据
控制器类
功能:用于获取用户的请求数据并(或)获取模型数据以显示到视图中
划分:通常按应用的模块(功能组)进行划分,一个控制器对应一个模块(页面)的不同功能/操作。
区别:与模型层相比,模型层通常严格按照表来进行划分,一个模型处理一个表的数据操作
动作:通常一个控制器是为了完成一个模块(页面)上的一些相关操作(功能),每个操作(功能)都对应一个控制器的动作(方法)。
基础控制器类
用于将控制器功能中的一些常见操作集中处理,比如设定文档编码,实现页面跳转。
**视图层(View)的典型实现**
功能:展示页面的静态内容,以及相关的变量数据。
数据分为:普通标量数据,数组数据, 对象数据。
有关MVC项目的其他常见做法
请求分发器
平台的区分
目录结构设定
基础常量设定
自动加载的实现
禁止其他目录中文件的直接访问
使用MVC框架模拟实现ECShop后台登录
数据库的准备
文件结构分析
登录流程分析
视图所需相关文件(css,js,图片等)
跳转的实现

PDO:PHP数据对象:

PDO介绍:
连接MySQL数据库:
DSN = "mysql:host=服务器地址/名称;port=端口号;dbname=数据库名";
Options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>’set names utf8’);
$pdo = new pdo(DSN, "用户名", "密码", Options);
执行sql语句
执行所有sql语句:query(sql)
执行无返回数据集的sql语句:exec(sql)
释放资源:
$pdo = null;
$result->closecursor();
pdo对象的其他常见操作
$pdo->lastInsertId();
$pdo->beginTransaction();
$pdo->commit()
$pdo->rollBack();
$pdo->inTransaction();
$pdo->setAttribute(属性名,属性值);
pdo的错误处理
错误模式:这是pdo的默认模式,可以获取pdo最后一次发生的错误信息。
$pdo->errorCode();
$pdo->errorInfo();
异常模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDOStatement(PDO结果集)对象
PDO结果集对象常用方法:
$stmt = $pdo->query(“select ...... ”);//这是获得结果集
$stmt->rowCount() ;
$stmt->columnCount() ;
$stmt->fetch( [返回类型] ); //返回类型常用的有:
PDO::FETCH_ASSOC:表示关联数组
PDO::FETCH_NUM:表示索引数组
PDO::FETCH_BOTH:表示前二者皆有,这是默认值
PDO::FETCH_OBJ:表示对象
$stmt->fetchAll([返回类型]);
$stmt->fetchColumn( [$i] );
$stmt->fetchObject();
$stmt->errorCode();
$stmt->errorInfo();
$stmt->closeCursor();
PDOStatement对象的预处理语句
语法一:$sql = "select * from tab1 where f1 = :val1 and f2 >:val2"; //命名参数形式
语法二:$sql = "select * from tab1 where f1 = ? and f2 >?"; //占位符形式
预处理:$stmt = $pdo->prepare($sql);//也就是“编译”该sql语句,这样就可以多次反复使用该语句
绑定值:$stmt->bindValue(命名参数或占位符序号, 值,[类型]);
绑定变量:$stmt->bindParam(命名参数或占位符序号, 变量,[类型]); //类型为可选项,包括:
PDO::PARAM_BOOL,
PDO::PARAM_NULL,
PDO::PARAM_INT,
PDO::PARAM_STR,
PDO::PARAM_BLOB,
PARAM_INPUT_OUTPUT:表示参数是“可传出值的”。
执行方式一:$stmt->excute(); //前提是前面进行的“绑定”操作
执行方式二:$stmt->excute(arry(":val1"=>值1,":val2"=>值2)); //对应命名参数形式
执行方式三:$stmt->excute(arry(值1,值2)); //对应占位符形式

异常:

**基本理解:**
错误:是程序出现问题时面向过程的处理方式,就是使用特定函数来捕获(取得)错误信息并进行处理;
**异常:**是程序出现问题时面向对象的处理方式,就是使用特定语法来捕获(取得)错误信息并进行处理。
基本使用形式:
异常的抛出(创建)
自定义异常类:
class myException extends Exception{
  function __construct($message, $code = 0){
    parent::__construct($message, $code);
  }
}
将常见的错误转换为异常:
class ErrorException extends Exception {
   function __construct($errMsg, $errCode, $errSeverity, $errFile, $errNo){}
}
set_error_handler("MyErrorHanler");
function MyErrorHandler($errCode, $errMsg, $errFile, $errLine{
  throw new ErrorException($errMsg, $errCode, $errCode, $errFile, $errLine);
}*
---------------------

php一种面向对象的语言,那么什么是面向对象呢?的更多相关文章

  1. 尽管以C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言

    “尽管以C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言”. 无论C++还是Java 都属于杂合语言.但在 Java 中,设计者觉得这种杂合并不象在 C++里那么重要.杂合语言 允许采用 ...

  2. Cocos2d-x 脚本语言Lua中的面向对象

    Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类 ...

  3. [转载] 详述三种现代JVM语言--Groovy,Scala和Clojure

    转载自http://www.tuicool.com/articles/jYzuAv和http://www.importnew.com/1537.html 在我与Martin Fowler曾经合作呈现的 ...

  4. R语言基于S4的面向对象编程

    前言 本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程. S4对象系统具有明显的结构化特征,更适合面向对象的程序设计.Bioconductor社区,以S4对象系 ...

  5. javascript是一种什么样的语言

    javascript是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTM ...

  6. Less (一种动态样式语言)

    Less (一种动态样式语言). LESS是一种由Alexis Sellier设计的动态层叠样式表语言,受Sass所影响,同时也影响了 Sass的新语法:SCSS. LESS是开源的,其第一个版本由R ...

  7. 应用AXIS开始Web服务之旅(soap web services)——使用三种不同的语言访问创建的Web服务,分别是JAVA、VB、VC

    一. 介绍 本文并不是想介绍Web服务的原理.系统架构等,我们假设您已经了解了关于Web服务的一些基本的概念.原理等知识.本文主要是针对那些已经了解Web服务概念,但是还没有亲身体会Web服务所带来令 ...

  8. 几种不同程序语言的HMM版本

    几种不同程序语言的HMM版本 “纸上得来终觉浅,绝知此事要躬行”,在继续翻译<HMM学习最佳范例>之前,这里先补充几个不同程序语言实现的HMM版本,主要参考了维基百科.读者有兴趣的话可以研 ...

  9. less 一种 动态 样式 语言

    LESS « 一种动态样式语言 http://www.bootcss.com/p/lesscss/ 一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承,运算, 函数 ...

随机推荐

  1. Mysql(Linux服务器)root用户密码忘记重置方法

    MySQL是非常常见的开源数据库,使用者众多,若是不小心忘记了安装在服务器的mysql密码,无法登陆,应该如何重置呢?方法很简单,现在和大家分享下.(系统环境:CentOs 6.5  软件:Mysql ...

  2. C#中抽象类与接口

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  3. P2488 [SDOI2011]工作安排 费用流

    \(\color{#0066ff}{ 题目描述 }\) 你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小.由于我们并不想使用Special Judge,也为了使选手 ...

  4. 关于NSFetchedResultsController的一些用法

    如何在iPhone等设备持久保存数据,需要用到Core Data,它能帮你快速而有效率的完成数据储存,Core Data 编程经常用到 NSFetchedResultsController这个类,刚开 ...

  5. 基础线程机制--Executor线程池框架

    基础线程机制 Executor线程池框架 1.引入Executor的原因 (1)new Thread()的缺点 ​  每次new Thread()耗费性能 ​  调用new Thread()创建的线程 ...

  6. appium中driver.wait报IllegalMonitorStateException的解释

    在写appium代码的时候,有的人想使用wait方法,写成:driver.wait(),结果抛出异常:IllegalMonitorStateException,看了appium client的api文 ...

  7. 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比

    算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}  要找出那些数相加等 ...

  8. inner join、left join、right join、full join

    A表 a1 b1 c1 01 数学 95 02 语文 90 03 英语 80  B表 a2 b2 01 张三 02 李四 04 王五 SQL语句:select A.*,B.* from A inner ...

  9. 2016"百度之星" - 资格赛(Astar Round1)C

    Problem Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字 ...

  10. 2015苏州大学ACM-ICPC集训队选拔赛(1) 1006

    取金币 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submissio ...