PHP面向对象的一些深入理解
1.$this就是这个对象的地址,$this不能在类外部使用.
2.构造函数 __construct 和析构函数都没有返回值;一旦一个对象成为垃圾对象(没有任何变量引用的对象,或者=null),析构函数 __destruct就会立即调用。析构函数不能传参数。
3.全局变量 global $a 在程序中都可以使用的变量(非面向对象)。
4.静态变量 public static $a 一个类的所有对象共享的变量(面向对象)。[类外访问] 类名::$a; [类内访问] 类名::$a 或者 self::$a
5.静态方法 public static function static_func_name(){ } 属于所有对象实例,静态方法只能操作静态变量;非静态方法既可以操作静态变量,也可以操作非静态变量。[类外访问] 类名:: static_func_name(); 或者 对象名-> static_func_name(); [类内访问] 类名:: static_func_name() 或者 self:: static_func_name()
6.关于访问修饰符:public(全局、继承类、本类);protected(继承类、本类);private(本类)。
7.继承 extends:子类默认不会调用父类的构造函数。[子类访问父类的方法(包括构造函数)] 父类::方法名(); 或者 parent::方法名(); 如果子类的方法和父类方法相同,称为 方法重写(或者叫:方法覆盖)。多态的体现:当子类没有覆盖父类的方法则调用父类的方法,当子类覆盖了父类的方法,则调用自己的方法。
8. 方法重载 overload(定义多个同名函数,我认为没这个必要),php5 默认不直接支持方法重载,使用__call魔术方法,模拟方法重载的效果。
9. 抽象类(可以是public/protected/private)和抽象方法是当父类的一些方法不能确定时会用到。抽象类 abstract class Obj{}; 抽象方法不能有方法体 abstract public function func_name(param1,...); 抽象类中可以没有抽象方法,但是抽象方法必须存在于抽象类中!如果A1类继承了一个抽象类 A,则要求A1类实现从A类继承的所有抽象方法
10.接口(更加抽象的抽象类,接口的方法都不能有方法体且必须是public,不能去实例化接口)。interface iJK{},class 类名 implements iJK,iJK2{}。接口中可以有属性,但是必须是常量,并且是public。 interface iUsb{ const A=90; //如果是 $a=90; 就会出错 } //要取到属性:iUsb::A; 一个接口不能继承其他的类,但是可以继承别的接口。一个接口可以继承多个其它的接口.当一个类去实现了某些接口,则必须把所有接口的方法都实现。 一个类可以同时继承他的父类,而且实现接口: class A1 extends A implements iUsb2,iUsb3{…}
11.final关键字:修饰类 或者 方法,不能修饰属性。 ① 希望某个类不能被继承: final class A{} ② 希望某个方法不能被子类重载(改写): class A{final public function func_name(){} }
12.const关键字:类中的常量。class 类名{const 常量名(大写)= 赋初值; } interface 接口名{const 常量名(大写)= 赋初值;} [调用方法]类名::常量名; 接口名::常量。在类的内部也可以使用 self::常量。
13.使用instanceof检测当前对象是否属于一个类的实例,返回布尔。get_class() 函数返回对象所属类的名字,如果不是对象则返回false。
[类的组合与继承]
1. 继承和多态都是对类进行复用,继承是类级别的复用,多态是方法级别的复用。
2. 子类继承父类的属性和方法,称为继承。
3. 在继承中,用parent指代父类,用self指代自身,用“:” 运算符(范围解析操作符)调用父类的方法。
4. 静态:如果声明类成员或方法为static,就可以不实例化类而直接访问,也不能用“:”访问一个非静态方法,如果这样会导致E_STRICT 级别的错误。php.ini: error_reporting=E_ALL | E_STRICT display_errors=On
5.继承最大的优点是扩展简单,但是其缺点大于优点。一般继承树不要多于三层。若要禁止被继承,使用final修饰符。
[接口 interface]
1. PHP 中接口的语义是有限的,使用接口的地方并不多,可以更多的使用抽象类。
2. SPL(标准PHP库),实现一些接口,最主要的就是iterator迭代器接口。
3. toString方法就是接口的一种变相实现;Traits可以被视为一种加强型的接口。
4. 接口只是一个声明,一旦使用interface关键字,就应该实现它。
[反射 ReflectionClass]
1.使用class函数返回对象属性的关联数组:
① get_object_vars($obj); //返回对象属性的关联数组
② echo get_class($obj); //获取对象属性列表所属的类
③ get_class_vars(get_class($obj)); //类属性
④ get_class_methods(get_class($obj)); //返回由类的方法名组成的数组
2. 反射完整的描述了一个类或者对象的原型,不仅可以用于类和对象,还可以用于函数、扩展模块、异常。
3. 反射的消耗很大,能找到替代方案的情况下就不要滥用。
【单例模式】
<?php class demo{ private static $MyObject ; //保存对象的静态属性 private function __construct(){} //私有化构造函数 private function __clone(){} //禁止克隆 public static function getInstance(){ if(!(self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } ?>
【魔术常量】
class moshu{ function __construct(){ echo "<br>".__LINE__; //当前的行数 echo "<br>".__FILE__; //当前文件绝对路径及文件名 echo "<br>".__DIR__; //当前文件绝对路径 echo "<br>".__CLASS__;//当前的类名 echo "<br>".__FUNCTION__; //当前的函数(方法)名 echo "<br>".__METHOD__; //类的方法名 echo "<br>".__NAMESPACE__; //命名空间[不常用] } } $ms=new moshu();
PHP面向对象的一些深入理解的更多相关文章
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- python面向对象开发的自我理解
详细代码理解可以参考 笨鸟教程博客:http://www.runoob.com/python3/python3-class.html 面向对象经常被提起,那到底什么是面向对象呢? 它的基本概念:类, ...
- java面向对象编程思想的理解
1.我们总说java是一门面向对象编程的语言,那什么是面向对象呢? 我是这样理解的,对象是事物存在的实体,如,猪.狗,花早等都是对象,对象由两部分组成.面向对象编程的三大特点:继承,多态,类是封装对象 ...
- 2017.12.25 Java中面向对象思想的深刻理解
今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 * A: 面向过程与面 ...
- 对Java面向对象中多态的理解
理解的要点:多态意味着父亲的变量可以指向子类对象 面向对象程序设计的三大支柱是封装.继承和多态 封装对外把相应的属性和方法实现的细节进行了隐藏.继承关系使一个子类继承父亲的特征,并且加上了一些新的特征 ...
- js的面向对象的程序设计之理解继承
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(六) 先来解析下标题——对象和继承~ 一.对象篇 ECMA-262把对象的定义为:&qu ...
- JS中面向对象的,对象理解、构造函数、原型、原型链
6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属 ...
- js面向对象的程序设计 --- 上篇(理解对象)
前言 ECMAScript中没有类的概念,因此它们的对象与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序的集合属性,其属性可以包含基本值,对象或者函数".正因 ...
随机推荐
- python_字典
1. 字典的定义 字典由多个键及其对应的值构成(我们也把键/值对称为项).键是唯一的,值不唯一.键可以是数字.字符串甚至是元组. 2. 字典的创建 (1) phonebook = {"} 名 ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之三---角色管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之三 角色管理源码分享 在上两篇文章 <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...
- redsocks 配合iptables设置全局sockts5代理
参照:http://kuaile.in/archives/1370 架构图: 第一步,安装redsocks 1. 安装依赖 yum install libevent-devel 2. 下载编译 git ...
- python安装MySQLdb驱动
安装了好几次了,索性几个笔记吧,经常因为返回gcc报错 安装 python-devel包即可
- curl获得http响应码 302 和绑定host
shell curl 取得HTTP返回的状态 获取状态码 curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com 获取时间 curl ...
- Java基础之在窗口中绘图——绘制圆弧和椭圆(Sketcher 3 drawing arcs and ellipses)
控制台程序. import javax.swing.JComponent; import java.util.*; import java.awt.*; import java.awt.geom.*; ...
- linux:计算机概论
1>.计算机的五大单元:输入单元.输出单元.CPU内部的控制单元.算术逻辑判断单元和主记忆体单元(记忆体包含主记忆体和辅组记忆体): 2>.CPU分为两类:精简微指令集(RISC)和复杂微 ...
- Leetcode: Graph Valid Tree && Summary: Detect cycle in undirected graph
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- hduoj 4706 Herding 2013 ACM/ICPC Asia Regional Online —— Warmup
hduoj 4706 Children's Day 2013 ACM/ICPC Asia Regional Online —— Warmup Herding Time Limit: 2000/1000 ...
- [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...