PHP 面向对象实现代码

  1,简单的对象创建

  

复制代码 代码如下:

  //类的作用域final:将阻止子类重写这个字段

  //方法的作用域abstract: 在父类中声明,在子类中实现

  //定义类:

  class Employee{

  //定义字段

  private $name;

  protected $title;

  public $wage;

  //常量

  const PI = 3.1415926;

  //静态成员变量

  private static $visitors = 0;

  //定义构造函数

  function __construct(){

  //使用静态成员变量

  self::$visitors++;

  echo "constructor";

  }

  //定义析构函数

  function __destruct(){

  echo "destruct";

  }

  //声明方法

  public function clockIn(){

  //使用字段

  echo "Member $this->name";

  }

  //在访问一个对象并不拥有的属性时(比如私有字段),如果该对象用户__get和__set方法,则会自动调用__get方法或__set方法

  function __set($property,$value){

  $this->$property = $value;

  }

  function __get($property){

  return $this->$property;

  }

  }

  //类的继承 Manager继承Employee

  class Manager extends Employee {

  function __construct(){

  //调用父类的构造函数或方法

  parent::__construct();

  parent::clockIn();

  echo "Manager constructor";

  }

  }

  //创建对象

  $employee = new Employee();

  $employee->wage = 10000;

  //使用常量

  echo Employee::PI;

  //调用方法

  $employee->clockIn();

  $manager = new Employee();

  //instanceof判断一个对象是类的实例、类的子类,还是实现了某个特定接口

  if($manager instanceof Employee ) echo "Yes";

  2,高级OO特性

  (1)对象克隆

  

复制代码 代码如下:

  //对象克隆

  class ClassA{

  private $name;

  private $title;

  public function setName($name){

  $this->name = $name;

  }

  function getName(){

  return $this->name;

  }

  public function setTitle($title){

  $this->title = $title;

  }

  public function getTitle(){

  return $this->title;

  }

  function __clone(){

  echo "我被克隆了","<br>";

  }

  }

  $classA = new ClassA();

  $classA->setName("NameA");

  $classA->setTitle("TitleA");

  $classB = clone $classA;

  $classB->setName("NameB");

  echo $classA->getName(),"<br>",$classA->getTitle(),"<br>";

  echo $classB->getName(),"<br>",$classB->getTitle(),"<br>";

  /* output

  我被克隆了

  NameA

  TitleA

  NameB

  TitleA

  */

  (2)接口

  

复制代码 代码如下:

  //接口

  interface IPillage{

  function method();

  }

  class ClassC extends ClassA implements IPillage {

  function method(){

  echo "inteface method";

  }

  }

  $classC = new ClassC();

  $classC->method();

  //inteface method

  (3)抽象类

  

复制代码 代码如下:

  //抽象类,是不能实例化的类,只能作为其它类继承的基类

  abstract class BaseClass{

  protected $name;

  abstract function method();

  }

  class ChileClass extends BaseClass {

  function method(){

  echo "method";

  }

  }

  $child = new ChileClass();

  $child->method();

  //output method

  注:

  如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建由一些不相关对象采用的功能,就使用接口。

  如果必须从多个来源继承行为,就使用接口。php可以继承多个接口,但不能扩展多个抽象类。

  如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。在接口中无法实现行为。