只为成功找方向,不为失败找借口

每天都不能停止前进的脚步
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PHP中的面向对象

Posted on 2009-11-10 18:48  冰碟  阅读(455)  评论(2编辑  收藏  举报

 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可以继承多个接口,但不能扩展多个抽象类。
如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。在接口中无法实现行为。