面向对象的PHP

类的实例(包括继承)

<?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
?>
时间: 2024-12-19 22:08:01

面向对象的PHP的相关文章

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

python—面向对象的封装

封装 私有属性 class Teacher: __identifier = 'Teacher' #私有静态属性 def __init__(self,name,pwd) self.name = name self.__pwd = pwd #私有属性 内部使用,外部不能使用 def pwd(self): print(self.__pwd) alex = Teacher('alex','3714') alex.pwd() class Teacher: __identifier = 'Teacher'

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆

python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写. 实例变量:定义在方法中的变量,只作用于当前实例的类. 继承:即一个派生类(de

php学习笔记 面向对象中[接口]与[多态性]的应用

代码如下: <?php /* 接口技术 * * 接口是一种特殊的抽象类,抽象类又是一种特殊的类 * * 接口和抽象类是一样的作用 * * 因为在PHP是单继承的,如果使用抽象类,子类实现抽象类就不能再去继承其他的类了 * * 如果既想实现一些规范,又想继承其他类.就要使用接口. * * 接口和抽象类的对比 * * 1.作用相同,都不能创建对象,都需要子类去实现 * * 2.接口的声明和抽象类不一样 * * 3.接口被实现方式不一样 * * 4.接口中的所有方法必须是抽象方法,只能声明抽象方法(不

php面向对象

面向对象 什么是面向对象? 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程 序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三个目标:重用性.灵活性和扩展性.为了实现整体 运算,每个对象都能够接收信息.处理数据和向其它对象发送信息. 什么是面向对象编程呢? 把每个独立的功能模块抽象成类形成 对象,由多个对象组成这个系统,这些对象之间都能够接收信息.处理数据和向其它对象

面向对象注意事项

在面向对象中,有实例变量和类变量,实例变量为类对象的实例成员,而类变量不仅类可以直接调用,而且类的对象也可以调用.类对象可以对实例变量进行添加.修改.删除操作等... 下面就用个示例来做参考: #!/usr/bin/env python # -*- coding:utf-8 -*- class PersonInfo(object): commity_data = 123 def __init__(self,name,age): self.name = name self.age = age de

java面向对象:面向对象的思想和概述

1:面向对象思想 面向对象是基于面向过程的编程思想. 面向过程:强调的是每一个功能的步骤 面向对象:强调的是对象,然后由对象去调用功能 2:面向对象的思想特点 A:是一种更符合我们思想习惯的思想 B:可以将复杂的事情简单化 C:将我们从执行者变成了指挥者 开发,设计,特征 面向对象开发 就是不断的创建对象,使用对象,指挥对象做事情. 面向对象设计 其实就是在管理和维护对象之间的关系. 面向对象特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism

6 面向对象之类和对象

1 面向对象和面向过程的区别 两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想. 区别: 1)编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类.属性及其方法,然后通过实例化类.执行方法来完成功能. 2)封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能. 3)面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势是明显. 2 类和对象 对象:客观存在的实体(一个具体的

简说面向过程与面向对象

昨天白天,因为在室外活动,无事可做,所以我思考了一天,在想怎么才能比较清晰的向人解释这两个概念.所以我对这两个概念的字面意思做了一下详细的解释.没想到,这可能真的会帮助我们非常简单的理解这两个概念. 面向:从字面上理解面向,就是我们的脸对着的地方,引申为我们能看到. 过程: 过程是事物从开始,到发展,到结束的整个经历 那么面向过程就是:我们能看到, 一个事物从 开始->发展->结束. 这对于我们写程序的人来说,可能会有感触,因为一开始我们写程序时.都是按照事件的发展.去安排计算机,一步一步的做