php面向对象(二)

php面向对象(二)

author zp 2015-10-31 15:59-07

克隆对象
php的对象是引用类型,变量名往往指代的是一个指针,这点与js很相似,直接将$spot对象赋值给$al对象,这俩个对象指向的内存中的同一个对象,所以改变一个另外一个也会受到影响,但是php4中却不是这样的。

   
   
  1. class Dog{
  2. public $name;
  3. function __construct($name) {
  4. $this->name = $name;
  5. }
  6. }
  7. $sopt = new Dog("haha");
  8. $al = $sopt;
  9. $al->name = "wangwang";
  10. echo $sopt->name; // wangwang

在php4中$spot中的成员变量并不会被改变,php5中的这样非常像js。php中有一个clone关键字,这个关键字可以为对象新开辟内存,使之成为俩个不同的对象。

   
   
  1. class Dog{
  2. public $name;
  3. function __construct($name) {
  4. $this->name = $name;
  5. }
  6. }
  7. $sopt = new Dog("haha");
  8. $al = clone $sopt;
  9. $al->name = "wangwang";
  10. echo $sopt->name; // haha

比较对象

   
   
  1. interface IAnimal{};
  2. class Dog implements IAnimal{
  3. public $name;
  4. function __construct($name) {
  5. $this->name = $name;
  6. }
  7. }
  8. $sopt = new Dog("haha");
  9. $al = clone $sopt;
  10. // 对象比较
  11. // "=="号表示对象值相等,"==="表示对象值相等,地址也相等这点与js非常不同啊,js中的俩个不同对象永远不可以相等啊,因为地址不同啊
  12. var_dump($al == $sopt); // true
  13. var_dump($al === $sopt); // false
  14. // php不能echo出来bool值啊
  15. // 对象检测 instanceof,这个和js的作用是一样的
  16. // intanceof可以检测当前对象是属于哪个类
  17. var_dump($al instanceof Dog); // true
  18. var_dump($al instanceof IAnimal); // true

魔术方法
__clone()在调用clone时会调用的方法

   
   
  1. class Dog {
  2. public $name;
  3. function __construct($name) {
  4. $this->name = $name;
  5. }
  6. function __clone() {
  7. echo "被克隆啦";
  8. }
  9. }
  10. $dog = new Dog("haha");
  11. $al = clone $dog;

__set()写入不存在或者不可见得成员变量时,php会执行__set()方法俩个参数,变量名称和变量值;
__get()在读取不存在或者不可见得成员变量时,php会执行__get()__get()有一个参数,参数就是需要读取的变量名;

   
   
  1. class Student {
  2. private $name;
  3. public $job = "student";
  4. function __construct($name) {
  5. $this->name = $name;
  6. }
  7. public function __set($age,$value) {
  8. $this->age = $value;
  9. }
  10. public function __get($type) {
  11. echo "__get()被调用了";
  12. return $this->$type;
  13. }
  14. }
  15. $stu = new Student("zp");
  16. $stu->age = 19;
  17. echo $stu->name;
  18. echo $stu->age;
  19. echo $stu->job; // 调用可见的public成员变量时,并不会调用__get

__call()方法,调用不存在或者不可见得成员方法时,php会先调用,__call()方法来存储方法名及其参数,__call()方法有俩个参数,即为方法么和方法参数,方法参数以数组存在

   
   
  1. class Student {
  2. private $name;
  3. function __construct($name) {
  4. $this->name = $name;
  5. }
  6. private function getName ($name) {
  7. return $this->name.$name;
  8. }
  9. public function __call ($foo,$arg) {
  10. echo "__call()被调用了";
  11. var_dump($arg);
  12. }
  13. }
  14. $stu = new Student("zp");
  15. echo $stu->getName('haha');

__toString()方法,echo对象时将调用这个方法,并且这个方法必须,返回一个字符串

   
   
  1. class Student {
  2. private $name;
  3. function __construct($name) {
  4. $this->name = $name;
  5. }
  6. public function __toString () {
  7. echo "__toString()被调用了";
  8. return $this->name;
  9. }
  10. }
  11. $stu = new Student('zp');
  12. echo $stu;

__sleep在对象序列化时会调用,__wakeup在对象反序列化时会调用

   
   
  1. class Student{
  2. public $name;
  3. public $age;
  4. function __construct($name,$age) {
  5. $this->name = $name;
  6. $this->age = $age;
  7. }
  8. public function __sleep() {
  9. echo "在序列化时会调用";
  10. }
  11. public function __wakeup() {
  12. echo "在反序列化时会调用";
  13. }
  14. }
  15. $obj = new Student('zp',19);
  16. var_dump(serialize($obj));
  17. var_dump(unserialize($obj));

__autoload可以调用自动实例化需要使用的类

我在同一目录下,建立了一个文件,这个文件内就是一个Test类,文件名为Test.class.php

   
   
  1. class Test{
  2. private $cont;
  3. public function __construct($cont) {
  4. $this->cont = $cont;
  5. }
  6. public function __toString() {
  7. return $this->cont;
  8. }
  9. }

在另外一个php中利用__autoload来自动实例化需要的test类

   
   
  1. function __autoload($class_name) {
  2. $class_path = $class_name.'.class.php';
  3. if (file_exists($class_path)) {
  4. include_once($class_path);
  5. } else {
  6. echo "类路径错误";
  7. }
  8. }
  9. $test = new Test("这是一个测试啊");
  10. echo $test;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值