类的结构:

类的内部能可能有三种东西,就是常量(constant),属性(property)和方法(method),功能可以理解成类外部的常量,变量和函数。

在这之中,属性和方法又可以使用public, protected, private三个不同的关键字来将属性和方法的作用范围做进一步的区分,带有private关键字的属性和方法,只有所在的类中的方法才能调用;带有protected关键字的属性和方法,除了自己以外,自己的父类和子类中的方法也可以调用;带有public关键字的属性和方法,则可以从实例化以后的对象中进行调用,这样做最大的好处给所有的属性和方法增加了一些描述的特征,更便于整理和组织代码的结构。const关键字先跳过,和后面的static一起讲。

static关键字是有别于public, protected, private的另一类型关键字(因此可以和public, protected, private叠加起来使用):

带有static关键字的方法,可以在不对类进行实例化的情况下直接通过“::”符号调用,和public, protected, private的搭配,也可以让调用区分权限,但是一般都是和public搭档,前面提到的常量关键字const,应该就是public static类型的,因此只能通过self::NAME,TEST::NAME这样的形式调用常量,后面的__construct,__destruct等方法,都是属于static。

类的结构部分,最后介绍的两个关键字是abstract和final,abstract关键字表示这个类必须被他的子类覆写,而final关键字表示这个类必须不能被他的子类覆写,这两个关键字的功能是正好相反的,带有abstract的方法被成为抽象方法,带有抽象方法的类,成为抽象类,这个在后面还有介绍。

类的使用:

类的使用主要有两种方法,一种是使用new关键字,另一种是使用“::”符号:

<?phpclassTEST {publicstaticfunctionname(){echo'value';}}//方法1:使用new关键字$test=newTEST;$test->name();//方法2:使用“::”符号TEST::name();?>

(1):使用new关键字成为实例化,上面的$test就是一个通过TEST类实例化而产生的对象,$test->name()称为调用$test对象的name方法。

(2):使用new关键字使用类的时候,可以使用$this来指代类本身。

(3):使用“::”符号的前提是方法必须是带有static关键字的,使用new关键字时,被调用的方法,必须带有public关键字(一个方法如果不带public, protected, private中的任何一个关键字,则默认为public)

(4):同一个类可以通过new关键字被实例成多个不同的对象,但是彼此之间的是隔离的;“::”符号在使用的时候,方法在多次使用之间,是共享的:

<?phpclassTEST1 {public$name=0;publicfunctionname(){$this->name=$this->name+1;}}$test1=newTEST1;$test2=newTEST1;$test1->name();//$name1 == 1$test2->name();//$name1 == 1/*--------------------------------------------*/classTEST2{publicstatic$name=0;publicstaticfunctionname(){TEST2::$name=TEST2::$name+1;}}TEST2::name();// $name == 1TEST2::name();// $name == 2?>

类的关系:

类与类之间的关系,主要有抽象,接口和继承:

(1)带有abstract关键字的类是抽象类,带有abstract关键字的方法是抽象方法,抽象类中的抽象方法,必须在子类中被覆写。

(2)带有interface关键字的类,就是接口,接口不允许实现任何的方法,接口中所有的方法,都必须在子类中被覆写。

(3)带有 classA extends classB 或者 classA implements classB 字样的就是继承,extends表示继承另一个类,implements表示继承另一个接口,一次只能extends一个类,但是可以implements多个接口。

(4)抽象类,接口,以及最终继承并实现的方法,都必须是public的。

在继承的过程中,子类会覆写父类的同名方法,这个时候如果需要在子类中调用父类的方法,可以使用parent关键字或者类名加上“::”符号调用:

<?phpclassTEST1extendsTEST2 {publicfunctionname(){echoparent::name2();echoTEST2::name2();}}classTEST2{publicfunctionname2(){echo'value2';}}$test=newTEST1;$test->name();?>

这里再解释一下“::”方法在类中的作用,一个作用是在没有实例化的情况下调用常量(其实也理解成static就可以了),static属性和方法,再一个是在类的内部,通过self,parent和类名建立便捷的调用通道。

对象于对象之间的关系,主要是“==”等于,“===”全等于,不等于和clone:

(1)两个类只要拥有相同的属性和方法,就是“==”等于。

(2)两个类必须是指向的同一个对象,才能是“===”全等于。

clone比较特殊,在上面的例子中,$test3 = $test1的过程并不是给了 $test3 一份 $test1 对象的拷贝,而是让 $test3 指向了 $test1,如果一定要获得一份$test1的拷贝,就必须使用clone关键字:

类的钩子:

__autoload:

是一个函数名,也是唯一一个在类的外部使用的钩子,在实例化一个对象的时候,如果没有预先载入类,就会调用这个钩子。

__construct

在类被实例话的时候,被调用的钩子,可以做一些初始化的操作。

__destruct

在类被销毁的时候,被调用的钩子。

__call

当对象试图调用一个不存在的方法的时候,被调用的钩子

__sleep

当使用serialize()函数对一个类进行序列话操作的时候,会调用这个钩子

__wakeup

当使用unserialize()函数对一个类进行反序列话操作的时候,会调用这个钩子

__toString

当一个对象将被转变为字符串的时候,会调用这个钩子(比如echo的时候)

__set_state

当调用var_export()函数操作一个类的时候,会调用这个钩子

__clone

当使用clone关键字对一个类进行拷贝操作的时候,会调用这个钩子

__get

在获取一个类中的属性值的时候,会调用这个钩子

__set

在设置一个类中的属性值的时候,会调用这个钩子

__isset

在使用isset()函数对类中的属性值进行判定的时候,会调用这个钩子

__unset

在使用unset()函数销毁一个属性值的时候,会调用这个钩子

类的小技巧:

在实例话一个类的时候,可以使用这样的形式给__construct钩子传递参数:

foreach()函数可以用来对类或者对象中的属性进行遍历,遍历的时候会先判断public, protected, private的情况而显示:

<?phpclassTEST {public$property1='value1';public$property2='value2';public$property3='value3';publicfunctionname(){foreach($thisas$key=>$value){print"$key=>$value\n";}}}$test=newTEST;foreach($testas$key=>$value){print"$key=>$value\n";}$test->name();?>

在给类中的方法传递参数的时候,可以对参数进行强制的判定,这里只支持对数组和对象的判定:

<?phpclassTEST1 {publicfunctionname(TEST2$para){}}classTEST2{}$test2=newTEST2;$test1=newTEST1;$test1->name('value');// 会报错,因为这个参数必须是TEST2实例化以后的对象$test1->name($test1);// 不会报错?>

兼容php4的语法:

php5的类是往下兼容php4的,这些php4时代的语法也得到了继承,但是并不建议在php5的环境中使用。

(1)使用var预设属性,会自动转换成public。

(2)使用类名作为构造函数,在没有__construct构造方法的情况下,会寻找和类名相同的函数作为构造函数。

posted on 2008-03-29 17:34 冰之焰 阅读(311) 评论(0)  编辑 收藏 引用 网摘

php 中class,PHP5中的类(class) (转)相关推荐

  1. PHP5中的stdClass

    PHP5中新增stdClass 官方手册参考:http://www.php.net/manual/en/language.oop5.basic.php#92123 stdClass类是PHP的一个内部 ...

  2. php对象持久化,在 Oracle 中完成 PHP5 对象的持久

    在 Oracle 中完成 PHP5 对象的持久 作者:Barry McKay 在数据库驱动的 Web 应用程序中实现 PHP5 对象的持久,朝着完全面向对象的 Web 应用程序开发迈进重要的一步. 2 ...

  3. smarty php5.5,php5中Iterator与smarty整合

    php5中Iterator与smarty整合 Iterator(迭代器)在PHP5中是非常重要的,我注意到Iterator在Smarty中不能正常的工作. Smarty会自动将一个object(对象) ...

  4. 理解PHP5中static和const关键字

    PHP5中加入了很多面向对象的思想,PHP5的面向对象比较接近Java的面向对象思想.我们这里对PHP5中的static和const关键字作用进行一下描述,希望对学习PHP5的朋友有帮助. (1) s ...

  5. php 类自动执行,php类中的魔术方法及类的自动加载

    类的模式方法都是 public 的,以 两个下划线开头,在某些情况下自动被调用,有点类似 hook 或者 事件触发. 魔术方法的传参方式不能使用引用. __construct() : 构造函数,实例化 ...

  6. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  7. java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...

    [多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...

  8. Python中如何使用构造方法定义类

    每个类都有一个默认的__init__()方法,如果在定义类时显式地定义了__init__()方法,则创建对象时Python解释器会调用显式定义的__init__()方法;如果定义类时没有显式定义__i ...

  9. 无监督机器学习中,最常见4类聚类算法总结 | 技术头条

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」,购票请扫码咨询 ↑↑↑ 编译 | 安然.狄思云 来源 | 读芯术(ID:AI_Discovery) 在机器学习过程中,很多数据都具有特 ...

最新文章

  1. 理解神经网络,从简单的例子开始(1)7行python代码构建神经网络
  2. XML文档DOM、SAX、STAX解析方式
  3. 风变python基础语法第11关_Python基础语法学习笔记之风变第十四关项目实操
  4. vc设备工程师_4注册公用设备工程师专业基础考试真题.
  5. 关于增强(五)-Class Enhancement
  6. mysql主码列允许null_mysql的一些基本操作
  7. web 折线图大数据量拉取展示方案_对比多种微前端方案
  8. DeepFake技术--DeepFake克星来了,简单两步算法造假图像无处可逃
  9. windows 下pcl的安装和编译
  10. 程序员必看书籍之二:编程语言实现模式
  11. 软件人员kpi制定模板_KPI绩效考核软件有哪些?拥有多种考核模板i人事
  12. 【Multisim】模拟电子技术综合设计实验:正弦波、方波、三角波信号发生器的设计与搭建
  13. 炸!撩下 OLAP 数据分析的黑马神器 ClickHouse
  14. 读书笔记之《内向者优势》
  15. 最近在写一款斗地主游戏,写了个癞子匹配顺子的算法
  16. 关于清除Reper病毒
  17. python2读取excel中文处理_用python + openpyxl处理excel(07+)文档 + 一些中文处理的技巧...
  18. C++——malloc()
  19. myBatis的入门配置
  20. 数字化转型 — 新能源汽车 — 生产制造流程 — 冲压车间

热门文章

  1. python计算结果传给spark_Spark入门:流计算简介(Python版)
  2. 傅里叶变换matlab案例,基于matlab的傅里叶变换
  3. 查看文件二进制编码_小白也能学会系列:用python文件读写代码实例!(简单案例)...
  4. 在Python中使用OpenCV裁剪图像
  5. stl max函数_C ++ STL中带有示例的array :: max_size()函数
  6. 【视频版】最新版Swagger 3升级指南和新功能体验!
  7. 案例:Redis 问题汇总和相关解决方案
  8. Visual Studio 2012资源管理器里单击打开改为双击打开文件
  9. Command10,Access数据库
  10. Unsigned 陷阱