类的实例(包括继承)

<?php
  // 父类
  class Animal {
    public $name;
    public $age;

    // 构造函数,使用new操作符生成实例的时候自动调用
    function __construct($name, $age) {
      $this->name = $name;
      $this->age = $age;
    }

    public function show() {
      echo $this->name . ' ' . $this->age . '<br/>' ;
    }

    // 析构函数,对象销毁的时候自动调用
    function __destruct() {
      echo 'object destroyed' . '<br/>';
    }
  }

  // 子类
  class Dog extends Animal {
    public $legs;

    function __construct($name, $age, $legs) {
      // 调用父类的方法
      parent::__construct($name, $age);
      $this->legs = $legs;
    }

    public function showLegNumber() {
      echo $this->legs . '<br/>';
    }
  }

  $myDog = new Dog('candy', 10, 4);
  $myDog->show();
  $myDog->showLegNumber();
  $myDog = null;      

  $hisDog = new Dog('sally', 5, 4);
  $hisDog->show();
?>

  在执行对象方法时,PHP将会自动定义一个$this的特殊变量(类似js的this),该变量表示对对象本身的引用,通过使用$this变量和'->'符号可以引用对象本身的所有属性和方法(类似js的this.)。

  析构函数是一个名为__destruct()的函数,它是在对象被注销时所调用的。通常PHP会在所有请求都结束时自动释放该对象所占有的资源,所以析构函数显的并不是那么重要。但是在某些情况下还是有用处的,如释放指定的资源或者记录日志信息。在上例中,就算没有将$hisDog对象赋值为null,在脚本执行结束时也将会自动调用其析构函数。

  类的继承需使用关键字extends,通常在PHP中使用parent表示父类,常用于访问父类的方法和属性;使用self表示子类,常用于访问当前类中的常量、静态变量和方法。

类的常量和静态属性、方法

  • 类的常量

  在PHP中,存在着全局常量,使用define关键字定义。而在PHP5中,还可以在类中定义常量。类的常量不属于任何的类的实例,只属于类的本身,且不可修改。定义类的常量很简单,只需要使用const关键字进行定义即可。对于类的常量的引用分为两种情况:一种是在类的内部进行引用,另一种是在类的外部进行引用。不管是何时进行引用,都需要使用范围解析操作符(::)。

<?php
  class Color {
    const RED = 'red';
    const BLUE = 'blue';
    const WHITE = 'white';

    function getWhite() {
      // 内部引用
      return self::WHITE;
    }
  } 

  // 外部引用
  echo Color::RED;

  $obj = new Color();
  echo $obj->getWhite();
?>
  • 静态属性、方法

  每一个类的实例都有其所有属性和方法的拷贝,但类还可以定义静态属性和静态方法。静态属性(方法)和类的常量一样,只属于类的本身,通过关键字static定义。访问方式和类的常量一样。

<?php
  class myClass {
    static $num = 0;
    function __construct() {
      self::$num++;
    }

    // 统计该类实例化的个数
    static function printNum() {
      echo self::$num . '<br/>';
    }
  }

  myClass::printNum();
  $a = new myClass();
  myClass::printNum();
  $b = new myClass();
  myClass::printNum();
  $c = new myClass();
  myClass::printNum();
?>

访问修饰符

  在使用面向对象的程序设计模式进行开发时,最为重要的一点就是封装和对象属性的访问保护,而访问修饰符就是因此诞生的。通常对于类属性和方法,访问保护都是通过3个关键字来实现的:public、protected和private。在开发时,需要制定属性或方法的访问权限,为了向下兼容,定义方法时未指定访问权限将自动设置为public(如定义属性为指定会报错)。

  指定为public的类属性和方法为公共的属性和方法,可以在任何作用域内访问。在对象外可以采用对象名->属性名(方法名)访问,在对象内部可以用$this->属性名(方法名)访问。若一个类从该类继承,则这个类的对象的外部和内部访问该类属性或者方法可以采用相同的方式。

  指定为protected的类属性和方法只能够在对象内部使用,即采用$this->(受保护)属性名(变量名)的方式进行访问。若一个类从该类继承,则受保护的类属性和方法也可以在类的对象的方法中采用如上方式访问。

  指定为private的类属性和方法和protected类似,只能在对象内部访问,同时也不能在继承类的实例对象中进行访问,因为私有属性和方法在继承的类中时看不到的。

  总结:public修饰定义可以从任何位置访问到类属性和方法;protected修饰符定义只能在类的内部及该类子类中(继承)进行访问;private修饰符定义只能在类的内部进行访问。

魔术方法

  在PHP中,除了提供静态方法外,还提供了几个有用的魔术方法。这里的魔术方法包括前面所讲的构造函数__construct()、析构函数__destruct(),以及字符串转换函数__toString()和克隆函数__clone()。

  • 字符串转换函数__toString()

  当用echo或者print输出一个对象时,将自动调用__toString()方法(不觉得比var_dump()好用)

<?php
  class Child {
    public $name;
    public $age;

    function __construct($name, $age) {
      $this->name = $name;
      $this->age = $age;
    }

    function __toString() {
      return $this->name . ' ' . $this->age . '<br/>';
    }
  }

  $myChild = new Child('hanzichi', 10);
  print $myChild;
  echo $myChild;
  var_dump($myChild);
?>
  • 克隆函数__clone()

  在实际应用中,除了采用new关键字创建对象外,还可以使用clone关键字实现对象克隆,所克隆的对象将拥有原对象的所有属性。

<?php
  class Child {
    public $name;
    public $age;

    function __construct($name, $age) {
      $this->name = $name;
      $this->age = $age;
    }

    function show() {
      echo $this->name . ' ' . $this->age . '<br/>';
    }
  }

  $myChild = new Child('hanzichi', 10);
  $hisChild = clone $myChild;
  $hisChild->show();  // hanzichi 10
?>

  有些时候我们并不需要克隆完全一样的对象,这时我们可以在类中定义__clone方法,克隆的时候会自动调用。

<?php
  class Child {
    public $name;
    public $age;

    function __construct($name, $age) {
      $this->name = $name;
      $this->age = $age;
    }

    function __clone() {
      $this->name = 'candy';
    }

    function show() {
      echo $this->name . ' ' . $this->age . '<br/>';
    }
  }

  $myChild = new Child('hanzichi', 10);
  $hisChild = clone $myChild;
  $hisChild->show();  // candy 10
?>

面向对象的PHP的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  10. .NET基础拾遗(2)面向对象的实现和异常的处理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. Sql Server之旅——第七站 为什么都说状态少的字段不能建索引

    我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道, 或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说 ...

  2. struts请求源码的跟踪

    最近工作任务不是很紧,时间也不能白白浪费,以前常用的struts2框架源码没去了解过,所以就跟踪一下struts2的整个执行过程.由于本人也是抱着学习的态度来阅读掩码,若文章在表述和代码方面如有不妥之 ...

  3. 客户访问站点将bbs/链接 跳转至forum/链接下的两种方式

    显性 302 暂时重定向跳转 server { listen 80 ; server_name localhost; index index.html index.htm index.php; roo ...

  4. RCC BUCK变压器设计

    RCC电路工作于临界模式,不是固定工作频率,其设计遵从BUCK原理.Buck电路在最高输入电压时为电感最恶劣工作条件: 以下图为例: 1.首先设定如下参数:输入电压Vin,输出电压Iout,工作频率f ...

  5. Security Tools (Contain CTF tools)

    From now on I will start to have fun with CTF and other security games or challenges. And I am going ...

  6. POJ3083Catch That Cow[BFS]

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 77420   Accepted: 24457 ...

  7. 深入探讨 java.lang.ref 包

    深入探讨 java.lang.ref 包 本文主要探讨了 java.lang.ref 包的使用方法,以及源码解读.并就该包在不同 JVM 上的表现进行了比较与分析.通过阅读本文,读者可以加深对 jav ...

  8. jvm虚拟机性能监控与故障处理工具

    java开发人员肯定知道jdk的bin目录中有java.exe javac.exe这两个命令行工具,但并非所有程序员都了解过jdk的bin目录之中其他命令行的作用.jdk的工具,体积都比较小,这些命令 ...

  9. Android中分页滑动实现总结

    手机的屏幕相对较小,因此会出现当有多项内容需要展示而不得不进行分页的情况.例如手机桌面的应用图标的展示.一般一屏可以显示4*4=16个小方块形的应用程序,可以通过左右滑动进行屏幕的选择.而Androi ...

  10. 转载 Appstore 上传被拒原因及解释

    原 apps被拒绝的各种理由以及翻译 1. Terms and conditions(法律与条款) 2. Functionality(功能) 3. Metadata (name, descriptio ...