php学习笔记------[php面向对象中常用关键字与魔术方法]
时间:2011-06-15 来源:代号极光
<?php /* * PHP中常用的关键字 * * final * 1. final不能修饰成员属性(类中的常量不是用这个关键在) * * 2. final只能修饰类和方法 * * 作用: * 使用final修饰的类不能被子类继承 * * 使用final修饰的方法不能被子类去覆盖 * * 用来限制类不被继承,方法不被覆盖 * * static * 1.使用static可以修饰成员属性和成员方法,不能修饰 * * 2.用static修饰的成员属性,可以被同一个类的所有对象共享 * * 3.静态的数据是存在内存中的数据段(初始化静态段) * * 4.静态的数据是在类被第一次加载时 分配到内存中的,以后在用到类时直接从数据段中获取 * * 5.什么是类被加载?只要在程序中使用到这个类(有这类名出现) * * 注意:静态成员都要使用类名去访问,不用创建对象,不用对象去访问 * 类名::静态成员 * * 如果在类中使用静态成员,可以使用self代表本类类名 * self::静态成员 * * 6.静态方法(static修饰),不能访问非静态的成员 * 因为非静态的成员,必须用对象来访问,而访问内部成员使用的是$this * 静态方法不能使用对象来调用,也就没有对象,$this也就不能代表什么对象,非静态的成员还必须使用对象 * 如果确定一个方法中不使用非静态成员,则可以声明为静态方法 * * * * * const * * 1.只能修饰成员属性 * * 2.普通声明常量:define('常量名','testesttest'); * * 3.在类中声明常量使用const * * 4.命名的方式和define是一样的效果 * * 5.访问方式和static静态成员属性时一样的(在类外部使用 类名::常量,在类内部使用 self::常量) * * 6.常量一定要在声明时就给初值 * * * PHP中常用的魔术方法 * * __call() * * 作用:在调用对象中不存在的方法时就会出现错误,然后程序退出。 * * 什么时候调用:就会在调用一个对象中不存在的方法时自动调用 * * 这个方法需要两个参数 * * __toString() * * 直接输出对象引用时自动调用,用来快速获取对象的字符串表示的最便捷的方式 * * * 对象串行化(序列化):将一个对象转为二进制串 * 1.将对象长时间存储在数据库或文件中时使用 * 2.将对象在多个PHP文件中传输时 * serialize():参数是一个对象,返回来的就是串化后的二进制串 * unserialize:参数就是对象的二进制串,返回来就是新生成的对象 * * __sleep() * 是在序列化时自动调用的方法 * * 作用:可以将一个对象部分串行化(序列化) * 只要这个方法中返回一个数组,数组中有几个成员属性 * * __wakeup() * 是在反序列化自动调用的方法 * * 是对象重新诞生的一个过程(__construct(),__clone(),__wakeup()) * * * __autoload() * 注意:其他的魔术方法都是在类中添加起作用,这是唯一一个不在类中添加的方法 * 只要在页面中使用到一个类,只要用到类名就会自动将类名传给这个参数 * * * __clone() * 克隆对象使用__clone去克隆 * * 原本(原来的对象) * * 副本(复制出来的对象 * * __clone()就是在克隆对象时自动调用的方法 * * 作用: * * 只要一个对象一诞生,就要有初始化的动作,和构造方法作用相似 * 在__clone()方法中的$this关键字,代表的是副本的对象,$that代表原本的对象 * * * * * */ class Person{ var $name; var $age; var $sex; const HOST="localhost";//类中声明常量 var static $country="China";//使用static,静态的成员属性 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; echo "###############"; } //静态的方法 static function test(){ echo "test test test <br>"; } function __call($methodName,$args){ echo "调用的方法{$methodName}(参数:"; print_r($args); echo ")不存在"; } function __toString(){ return "{$this->name}1111111111122222<br>"; } //克隆对象时自动调用 function __clone(){ $this->name="副本"; } //此方法不能被覆盖 final public function say(){ echo "我的名字:{$this->name},我的年龄{$this->age}:,我的性别:{$this->sex}<br/>"; } protected function eat(){ echo "wwwwwwwwwwwwwwwwwwwww<br>"; } function run(){ echo self::HOST;//类内部访问常量 } protected $name protected $age; protected $sex; } class Student extends Person{ var $school; function __construct($name,$age,$sex,$school){ parent::__construct(); $this->school=$school; } protected function say(){ parent::say(); echo "我所在的学校{$this->school}<br/>"; } function study(){ echo "{$this->name}在学习<br/>"; } } echo Person::$country;//访问静态成员 echo Person::HOST;//外部访问常量 $p=new Person(); echo $p;//会自动调用__toString() $p1=clone $p;//克隆 //__autoload使用 function __autoload($className){//每次使用类名都会调用此函数,并把类名传给参数 include "./".$className.".class.php"; } ?>
相关阅读 更多 +