找回密码
 立即注册
搜索
查看: 1863|回复: 0

[面向对象] 【OOP代码示例】魔术方法

[复制链接]

581

主题

110

回帖

4066

积分

管理员

积分
4066

众神之神

发表于 2016-1-27 18:02:39 | 显示全部楼层 |阅读模式
克隆对象
  1. <?php
  2. class demo{
  3.     public $name;
  4.     public $age;

  5.     public function __construct($name, $age){
  6.         $this -> name = $name;
  7.         $this -> age = $age;
  8.     }

  9.     public function say(){
  10.         echo "say ".$this-> name;
  11.     }

  12.     //__clone() 魔术方法 是在克隆对象时被自动调用的
  13.     //作用:可以对新对象的成员属性进行赋值
  14.     public function __clone(){
  15.         $this -> name = "lisi";
  16.         $this -> age = 20;
  17.     }
  18. }

  19. $demo = new demo("zhangsan", 18);
  20. $demo -> say();

  21. $demo1 = clone $demo;

  22. echo "<hr />";
  23. $demo1 -> say();
  24. var_dump($demo1);
复制代码

类中通用的方法 __toString( )
  1. <?php
  2. class demo{

  3.     public $name;

  4.     public function __construct($name){
  5.         $this -> name = $name;
  6.     }

  7.     //魔术方法__toString()  是直接echo 或print 对象时被自动调用
  8.     //作用:可以直接返回字符串或用于调用流程处理
  9.     public function __toString(){
  10.         $this -> d();
  11.         $this -> e();
  12.         return '';
  13.     }

  14.     private function d(){
  15.         echo "d....";
  16.     }

  17.     private function e(){
  18.         echo "e...";
  19.     }
  20. }

  21. $demo = new demo("zhangsan");
  22. echo $demo;
复制代码

__call( ) 方法的应用
  1. <?php
  2. class db{

  3.     private $sql = array("table" => '',
  4.                          "field" => '*',
  5.                          "where" => '',
  6.                          "order" => '',
  7.                          "limit" => '');
  8.     //魔术方法 __call() 是在调用 一个不存在的方法时被自动调用
  9.     //第一个参数:调用的方法名
  10.     //第二个参数:调用方法时传的参数列表(数组)
  11.     /*
  12.     public function __call($methodName, $args){

  13.         echo "你所调用的方法{$methodName}(),参数:";
  14.         print_r($args);
  15.         echo "不存在!";
  16.     }
  17.      */

  18.     public function __call($methodName, $args){
  19.         //判断调用的方法名是否是成员属性数组的下标
  20.         if(array_key_exists($methodName,$this-> sql)){
  21.             //如果是就进行赋值操作
  22.             $this -> sql[$methodName] = $args[0];
  23.         }else{
  24.             //如果不是就给出提示信息
  25.             die("你所调用的方法{$methodName}()不存在!");
  26.         }

  27.         //返回本对象,为了实现连惯操作
  28.         return $this;
  29.     }

  30.     public function select(){
  31.         if($this -> sql['where']){
  32.             $where = "WHERE {$this -> sql['where']}";
  33.         }

  34.         if($this -> sql['order']){
  35.             $order = "ORDER {$this -> sql['order']}";
  36.         }

  37.         if($this -> sql['limit']){
  38.             $limit = "LIMIT {$this -> sql['limit']}";
  39.         }
  40.         $sql = "SELECT {$this->sql['field']} FROM {$this -> sql['table']} {$where} {$order} {$limit}";
  41.         echo $sql;
  42.     }

  43. }

  44. $db = new db();
  45. $db -> table("user")->field("id,username,pwd")  -> where("id <100") -> select();
  46. var_dump($db);
复制代码

自动加载类
  1. <?php

  2. //__autoload() 是在实例化对象时,如果类不存在就会被自动调用
  3. //参数:实例化的类名
  4. //作用:可以用于自动引入类文件
  5. function __autoload($className){
  6.         //注意:类文件名要有规律
  7.         //      类文件名要与类名统一的部分
  8.         //      类文件的路径要有规律
  9.         $file = $className.".class.php";
  10.         $path = "./class/".$file;

  11.         if(file_exists($path)){
  12.             include($path);
  13.         }else{
  14.             die("你调用使用的{$className}.class.php 文件不存在");
  15.         }
  16.     }

  17. $demo = new demo();
  18. var_dump($demo);
  19. $demo1 = new demo1();
复制代码
./class/demo.class.php
  1. <?php
  2. class demo{

  3. }
复制代码

对象串行化
  1. <?php
  2. class demo{
  3.    
  4.     public $name;
  5.     public $age;
  6.     public $sex;

  7.     public function __construct($name, $age, $sex){
  8.         $this -> name = $name;
  9.         $this -> age = $age;
  10.         $this -> sex = $sex;
  11.     }

  12.     //魔术方法__sleep() 是在串行化对象时被自动调用
  13.     public function __sleep(){
  14.         //返回一个数组,数组的值就是要串行化的成员属性名
  15.        return array("name","sex","age");
  16.     }

  17.     //魔术方法 __wakeup() 是在反串行化对象被自动调用
  18.     public function __wakeup(){
  19.         //可以把发生改变的成员属性进行重新的赋值操作
  20.         $this->age = $this -> age + 1;
  21.     }
  22. }
  23. /*
  24. $demo = new demo("lisi",20,"nan");
  25. $str = serialize($demo);        //串行化 可以串行化数组也可以串行化对象,串行化对象时只是串行化了成员属性
  26. $handle = fopen("./data.txt","w+");
  27. fwrite($handle,$str);
  28. fclose($handle);
  29. var_Dump($str);
  30. */
复制代码
  1. <?php
  2. $arr = array("name"=>"zhangsan","age"=>18,"sex"=>"nv");
  3. $str = serialize($arr);
  4. var_dump($str);
  5. $arr1 = unserialize($str);
  6. var_dump($arr1);
复制代码
  1. <?php
  2. include("./demo.class.php");
  3. $str = file_get_contents("./data.txt");
  4. $d = unserialize($str); //可以把串行化的结果进行反串行化操作
  5. var_dump($d->age);
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|十三博客 ( 鲁ICP备2023000528号 )

GMT+8, 2026-6-1 18:45 , Processed in 0.170447 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表