文章目录

  • 声明一个类
    • 声明属性
    • 声明类常量
  • 继承
  • trait
  • 构造函数
  • 析构函数
  • 自省
  • 序列化

声明一个类

语法如下:

class classname[ extends baseclass [ implements interfacename, [ interfacename, ...] ] ]
{[ use traitname, [traitname, ...]];[ visiblity $property[ = value]; ...][ function functionname (args) ]{//code}
}

PHP 中的面对对象和 Java 中的面对对象用法基本相似。只是用法更随意。

比如:它可以用一个变量来提供类名:

$class = "Person";
$object = new $class;
// 等同于
$object = new Person;

静态方法通过类来调用,而不是通过对象调用。静态方法由类名加两个冒号(::)和函数名构成。另:在静态方法内部,$this 会失效。

HTML::p("Hello, world");

对象一旦被创建,就会通过引用传递。要像得到一个对象的副本,可以使用 clone 操作符。

$f = new Person("Fred", 35);
$b = clone $f;

final 关键字来声明一个类/方法,子类将无法重写这个类/方法。

在一个对象类的实例中,可以用 self 关键字来调用属性或方法。

声明属性

在 PHP 中,你可以任何位置增加新的属性。

class Person
{function getName(){return $this->name;}function  setName($newName){$this->name = $newName;}
}
$person = new Person;
$person->setName("plane");
echo $person->getName(); // plane

声明类常量

使用 const 关键词来声明常量。一旦定义了一个类常量,他的值就不能在改变。

继承

如果一个子类与它的父类具有相同名称的属性或方法,则子类中的属性和方法比父类中的优先级高。引用类的属性会返回之类中的属性值,引用类方法时也会调用子类中的方法。

parent::birthday(); // 调用父类中的 birthday 方法
self::birthday(); // 调用当前类中的 birthday 方法

trait

PHP 5.4 新增特性,它允许在不创建一个父类的情况下,便可以在不同层次结构的类中复用类外部的代码,共享不同类的函数方法。语法如下:

trait traitname [ extends baseclass ]
{[ use traitname, [ traitname, ... ]];[ abstract function functionname(); [...] ][ visibility $property [ = value ]; ... ][ function functionname (args){//code} ]
}

如果引入多个 trait 出现重名的情况,可以在类中定义一个别名。

trait Command
{function run(){echo "Executing a command";}
}trait Marathon
{function run(){echo "Running a marathon";}
}class Person
{use Command, Marathon {Command::run as runCommand;Marathon::run insteadof Command;}
}$person = new Person;
$person->run(); // "Running a marathon"
$person->runCommand(); // "Executing a command"

构造函数

在创建一个对象是,会自动调用名为 __construct() 的函数。

PHP 并不支持构造函数链的自动调用,也就是说,当实例化子类时,只有子类自己构造函数会被调用,父类的构造函数不会被调用。我们可以显式地调用父类的构造函数:parent::__construct()

析构函数

当一个对象被销毁时,就会自动调用名为 __destruct() 的函数。

自省

自审是一种让程序检查对象特性的机制,可以检查对象的名称、父类、属性和方法等。

class_exists() : 确定一个类是否存在。

method_exists() : 确定函数是否存在。

get_declared_classes() : 返回一个包含所有已定义的类的数组。

get_class_methods() : 得到一个类中只有默认值的属性。

get_class_vars() : 得到一个类中所有方法。

get_object_vars() : 返回对象中只有默认值的属性。

get_parent_class() : 得到一个类的父类名称。

display_classes() : 显示所有当前已声明的类,以及他们的方法和属性。

is_object() : 确定是否为一个对象。

序列化

序列化一个对象是指将一个对象转换成字节流的形式,这样就可以将对象保存在文件中。这对数据的持久化非常有用。PHP 中的序列化几乎时全自动的,除了要调用 serialize()unserialize() 函数外,你几乎不需要做任何额外的工作。

在序列化和反序列化的过程中,PHP 有两个用于对象的钩子( hook ):

__sleep() : 一个对象被序列化之前被调用。

__wakeup() : 一个对象从字节流中被创建时调用。

感谢你看到了这里。如果文章有错误,请评论指正,谢谢!

PHP 入门 - 6.面对对象相关推荐

  1. 六、Scala从入门到精通一一面对对象编程(初级)

    目录 6.面向对象编程 6.1.类与对象 6.1.1.Scala语言是面向对象的 6.1.2.快速入门-面向对象的方式解决养猫问题 6.1.3.类与对象的区别和联系 6.1.4.如何定义类 6.1.5 ...

  2. python释放类对象_Python 基本功: 10. 面对对象-类 Class

    虽然 Python 可以写函数式编程,但是本质上是一门面对对象编程语言 (object-oriented programming language),简称 oop.面对对象编程是把代码包装成一个对象 ...

  3. 关于面对对象和正则表达式的处理

    面对对象是软件开发的方法.面对对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构.AD技术.人工智能等领域.面向对象是一种对现实世 ...

  4. 第四十二篇 面对对象进阶

    目录 面对对象进阶 * 补充(数据类装饰器:复制类中的数据属性) 一.类的继承 1.什么是继承 2.为什么用继承 3.对象的继承 4.继承与抽象 5.继承的应用 6.对象查找属性的顺序 二.类的派生 ...

  5. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  6. Javascript的面对对象的理解 【上】(prototype,函数和对象等概念)

    首先先生明一下JavaScript面对对象和Java,c#这种高级语言的面对对象有很较大的不同. JavaScript在面对对象"继承"的时候,可以动态的修改修正.换句话说可以动态 ...

  7. 如何用面对对象来做一个躁动的小球?

    今天来看看怎样用面对对象来做一个躁动的小球. 首先我们先创建一个对象,他的属性包含小球的随机水平.纵向坐标,随机宽.高,随机颜色,以及创建小球的方法. html: <div id="w ...

  8. 【JAVA基础篇】面对对象的特征

    面对对象的3大特征是:封装.继承和多态 封装 封装就是将客观的事物封装成抽象的类,这个类包含这类事物共同的特性和行为,特性对应类的成员变量,行为对应类的成员方法.并且类可以让自己的成员变量和成员方法让 ...

  9. python遇到对象_### python面对对象小汇总 #####

    python面对对象小汇总 类的起名规则 # 所有的类名要求首字母大写,多个单词使用驼峰式命名法 如 ValueError # 类中方法: 普通方法 类方法 静态方法 魔术方法 class Phone ...

最新文章

  1. 点滴积累【JS】---JS小功能(setInterval实现图片效果显示时间)
  2. 图卷积网络进行骨骼识别代码_【骨骼行为识别】2s-AGCN论文理解
  3. 喂,你经历过两三年前的前端开发吗?
  4. ES6学习笔记04:Set与Map
  5. 最新图解 github 修改github地址 用户名
  6. Linux网络服务参数配置说明及实战
  7. java 运维系统_Java 应用运维
  8. 小程序设置发送验证码倒计时
  9. 局域网有几台电脑频繁断网_关于电脑经常掉线的那些事,解决方法
  10. vmware不显示usb图标解决办法
  11. 第二章 信托的关系及其设立
  12. 线下销售增长51%,荣耀靠的可不是把体验店装修的像Apple store
  13. 怎么调用微信自带的收货地址和我的地址功能页面。
  14. NPOI导出word,NPOI导出word表格,NPOI复制table表格 XWPFDocument中XWPFTable
  15. python软件电脑配置要求-Python实现的读取电脑硬件信息功能示例
  16. android开发板出错,Kernel panic - not syncing: Attempted to kill the idle task!出错,求助!!!...
  17. The requested resource(/)is not available问题
  18. 华硕vm510l拆电池图解_华硕vm510l的拆机教程详解 参数报价
  19. 不换门可以改开门的方向吗_不换门可以改开门的方向吗?
  20. 临终的悲剧——————抢救最后一口气

热门文章

  1. webbench windows_linux下的web并发测试工具汇总:ab, siege和webbench
  2. java重命名sheet失败_java jxl excel 数据导出 重新命名无效的工作表名称 | 学步园...
  3. linux7安装pgsql数据库,CentOS7下PostgreSQL安装
  4. django的ajax_get请求
  5. mysql 建表代码
  6. java应该学的基础东西
  7. python和c语言哪个效率高_C语言和Python哪个更容易学?
  8. lib和dll的区别、生成以及使用详解
  9. 玩转Linux必备知识(四)
  10. 《leetcode》best-time-to-buy-and-sell-stock-i-ii-iii