php学习笔记之--面向对象常用关键字与魔术方法

面向对象常用关键字与魔术方法

/***************final***********/

final class Demo {
.......
}

final function demo() {
........
}

1.final不能修饰成员属性

2.final只能修饰类和方法

3.使用final修饰的类不能被子类继承

4.使用final修饰的方法不能被子类覆盖

 

/*********static*******/

1.使用static修饰成员属性和成员方法,不能修饰类。

2.用static修饰的成员属性,可以被同一类的所有属性所共享,使用其中一个对象改动类的属性,其他对象的也会改变。

class Demo {

var $name;
var $age;
static $edu="hicc";

........

}

$demo1=new Demo;
$demo2=new Demo;
$demo3=new Demo;

$demo1->edu="hbu"; //demo1对象改变静态成员的edu属性的值
Demo::$edu="hbu"; //也可以通过类直接修改

//因为静态成员属性共享,所以demo2,demo3的输出也会改变

echo $demo2->edu;
echo $demo3->edu;

3.静态变量static是存在内存的数据段中(即初始化静态段)

4.静态的数据实在类被第一次加载时分配到内存中的,以后再用到类是直接从数据段中获取。

5.什么是类被加载?只要在程序中使用到这个类就是被加载(有这个类名出现)

注意:静态的成员都要用类名去访问,不用创建对象,不用对象去访问

     类名::静态成员

6.类一级别通过::访问,对象级别通过=>访问。

7.self::本类方法和属性

   parent::父类方法和属性

class Demo1 {

........
function say(){
........
}
........
}

class Demo2 extends Demo1 {

.......
function eat(){
........
}
function test (){
parent::say(); //调用父类方法
self::eat(); //调用本类方法
}

}

8.静态方法(static修饰的方法)不能访问非静态的成员(但在非静态方法中可以访问静态成员)

因为非静态成员,要通过对象来访问,访问对象内部的成员使用的是$this

静态方法不能使用对象来调用,也就没有对象。

注:如果确定一个方法不使用非静态成员,则可以将这个方法声明为静态方法(这样可以不用创建对象直接通过类名就可以访问,既省空间,速度又快)

9.单例模式(某个类只能有一个对象,比如数据库连接类)

 

/**********const*********/

1.只能修饰成员属性

2.在类中声明常量属性,使用方法与在类外声明常量define()是一样的。

class Demo {
......
const HOST="localhost"; //在声明时赋值(四种标量数据类型)
......

self::HOST; //类内部访问
}

echo Demo::HOST; //在类外部访问

Demo::HOST="test"; //语法错误,常量值不能修改

3.访问方式和stactic修饰类中静态属性一样(在类外使用 类名::常量  ,在类内部 self::常量)

4.常量一定要在声明时就给值

 

面向对象常用的魔术方法

/***********__call()**********/

作用:在调用对象中不存在的方法时就会出现系统报错,然后程序退出。可以使用__call()方法,在调用一个对象不存在的方法时自动调用__call()处理一些不存在方法的错误使用。

使用:

__call($methodname,$args){

.........

}//传入两个参数,调用的方法名,和该方法的参数(因为参数为多个所以定义的为数组)。

 

 

/***********__construct()*********/

 

 

PHP4中构造函数的函数名都是与类名相同,当然PHP5也支持这样(如果找不到__construct方法后会找函数名与类名相同的作为构造函数),之所以这样写的好处是如果我们想更改类的名字,我们就只改类名就可以,不用在更改构造函数的函数名,同时从某种程度上减少了我们出错的概率

 

 class Test   

{   
 function __construct()   
 {   
  echo "before";   
 }   
}   
$t = new Test(); 


 /***********__destruct()*********/

 PHP将在对象被销毁前(即从内存中清除前)调用这个方法,

默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存.

当PHP决定你的脚本不再与对象相关时,析构函数将被调用.
在一个函数的命名空间内,这会发生在函数return的时候.对于全局变量,这发生于脚本结束的时候.

如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.

class Test   
{   
 function __destruct()   
 {   
  echo "end";   
 }   
}   

$t = new Test(); 

 

 /***********__get( $property ) *********/

 如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息,传递的参数是被访问的属性名。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作

class Test   
{   
 public function __get($key)   
 {   
  echo $key . " 不存在";   
 }   
}   
 
 
$t = new Test();   
echo $t->name;   
 
就会输出:  

name 不存在  

 

/***********__set( $property, $value ) *********/ 

 当试图向一个并不存在的属性写入值的时候被调用,传递的参数是被设置的属性名和值。

class Test   
{   
 public function __set($key,$value)   
 {   
  echo '对'.$key . "附值".$value;   
 }   
}   
 
 
$t = new Test();   
$t->name = "aninggo";   
 
就会输出:  

对 name 附值 aninggo

 

/***********__isset() *********/ 

__isset() 当对一个未声明或者访问级别受限的成员属性调用isset函数时调用此函数,共用户做一些操作

  

/***********__unset() *********/

__unset() 当对一个未声明或者访问级别受限的成员属性调用unset函数时调用此函数,共用户做一些操作 

 

/***********__toString()*********/

直接输出对象引用时调用,用来快速获取对象的字符串表示的最便捷的方式。

class Demo {
var $name;
.......

function __tostring (){
return "{$this->name}";
}
}

$demo=new Demo;

echo $demo; //直接输出对象name属性

 

/**************__clone()***************/

1. $p1=$p; //这不是克隆,只是一个对象两个引用 ,指向的都是同一块内存,改动其中一个,另一个也会变。可以用析构__destruct来查看是否释放了两块内存。

    $p1=clone $p // 克隆对象。

2. __clone() 实在克隆对象时自动调用的方法。(只要对象一诞生就要有初始化的动作,和构造方法_construct初始化一样)

    $this->name中的$this关键字访问的是clone后的对象。

    $that->name是代表clone对象的

class Demo {

.........
function __destruct() {
echo "{this->name}"; //
}

}

$demo1=new Demo;

$demo2=$demo1; //不是克隆,只是一个对象两个引用。释放一个对象内存

$demo3=clone $demo1; //克隆对象。释放两个对象内存

 

/*******************__autoload()*****************/

 

1.这是一个唯一一个不再类中添加的方法,其他的魔术方法都是在类中添加起作用。

 

2.只要在页面中使用到某个类,只要类名一出现就会将类名自动传给aotoload的参数。

注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,所以应该在函数本身做捕获。 

 

autoload自动加载类
/*********one.class.php******/
class One {
function one (){
echo "one";
}
}

/*********two.class.php******/
class Two {
function two (){
echo "two";
}
}

/*********three.class.php******/
class Three {
function three (){
echo "three";
}
}

/***********test.php**********/
function autoload($className){
//只要在类中使用到类,就会自动将类名传给这个参数
include "./".$className."class.php";
}

$one=new One;
$one->one();

$two=new Two;
$two->two();

$three=new Three;
$three->three();



 /**************对象串行化(序列化)************************/

//////////__sleep()//////////

/////////__wakeup()////////////

 

 /**************__set_state************************/

 当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。

 本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。

 /**************__invoke(PHP 5.3.0以上版本有效)************************/

 当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。

/**************__callStatic(PHP 5.3.0以上版本有效)************************/

 它的工作方式类似于__call() 魔术方法,__callStatic() 是为了处理静态方法调用。

 PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此 

posted @ 2011-10-10 15:19  漠北风  阅读(351)  评论(0编辑  收藏  举报