php魔术方法详解


__autoload

    很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表。  
      
    在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的自动加载类。  
      
    在 PHP 5 中,可以定义一个 __autoload()函数,它会在试图使用尚未被定义的类时自动调用,通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类, __autoload()函数接收的一个参数,就是你想加载的类的类名,所以你做项目时,在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,也可以加上统一的前缀或后缀形成文件名,比如xxx_classname.php、classname_xxx.php以及就是classname.php等等.  
      
       
      
    本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类  
      
    <?php  
      
      
    function __autoload($classname)  
      
    {  
        require_once $classname . '.php';  
    }  
      
      
    //MyClass1类不存在自动调用__autoload()函数,传入参数”MyClass1”  
    $obj  = new MyClass1();  
      
       
      
    //MyClass2类不存在自动调用__autoload()函数,传入参数”MyClass2”  
    $obj2 = new MyClass2();  
    ?>  


__call()

    <?php  
    header("content-type:text/html;charset='utf-8'");  
      
    /*  
    __call处理调用错误  
      
    在程序开发中,如果在使用对象调用对象内部方法时候,调用的这个方法不存在那么程序就会出错,  
    然后程序退出不能继续执行。那么可不可以在程序调用对象内部不存在的方法时,提示我们调用的方法及使用的参数不存在,  
    但程序还可以继续执行,这个时候我们就要使用在调用不存在的方法时自动调用的方法”__call()”.  
      
    “__call()”方法,这个方法有2个参数,第一个参数为调用不存在的方法过程中,自动调用__call()方法时,  
    把这个不存在的方法的方法名传给第一个参数,第二个参数则是把这个方法的多个参数以数组的形式传进来。  
    */  
      
    class Test  
    {  
      
           //调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数  
      
           function __call($function_name, $args)  
           {  
      
                  print "你所调用的函数:$function_name(参数:";  
      
                  print_r($args);  
      
                  print ")不存在!<br />";  
      
           }  
      
    }  
      
       
      
    //产生一个Test类的对象  
    $test=new Test();  
    //调用对象里不存在的方法  
    $test->demo("one", "two", "three");  

__clone()

    <?php  
    header("content-type:text/html;charset='utf-8'");  
      
    /*克隆对象  
     有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,  
     这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。  
     */  
       
     class Person  
    {  
      
          //下面是人的成员属性  
      
          public $name;    
          public $sex;      
          public $age;      
      
           
      
          //定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值  
      
          function __construct($name,$sex,$age)  
          {  
                 $this->name=$name;  
                 $this->sex=$sex;  
                 $this->age=$age;  
          }  
      
      
      
          //这个人可以说话的方法, 说出自己的属性  
          function say()  
          {  
                 echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";  
          }  
      
           
      
          //对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法  
          function __clone()  
          {  
                 //$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。  
                 $this->name="我是假的";  
                 //$this->name="我是假的$that->name";  
                 $this->age=30;  
          }  
      
          /*  
              public function __clone()   
             {    #复制方法,可在里面定义再clone是进行的操作  
                $this->id = 0;  
                $this->account = clone $this->account;    #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改  
             }  
             */   
      
    }  
      
       
      
    $p1=new Person("张三", "男", 20);  
    $p2=clone $p1;  
    $p1->say();  
    $p2->say();  
      
    /*  
    上例输出:  
    我的名子叫:张三 性别:男 我的年龄是:20  
    我的名子叫:我是假的张三 性别:男 我的年龄是:30  
    */  

__toString()方法

    <?php  
    header("content-type:text/html;charset='utf-8'");  
      
    /*  
    定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用了”__toString()”方法,   
    输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有个返回值(return 语句).  
      
      
    当我们有了__toString()时,运行程序是不会报错,会给出一个友好的提示,或者说当我们输出实例化的对象时  
    会运行__toString()方法,里面运行什么我们自己定义。  
      
      
    */  
      
    class TestClass  
    {  
        public $foo;  
      
        public function __construct($foo) {  
            $this->foo = $foo;  
        }  
      
          
        //定义一个__toString方法,返加一个成员属性$foo  
        public function __toString() {  
            return $this->foo;  
        }  
    }  
      
    $class = new TestClass('Hello');  
      
    //直接输出对象  
    echo $class;  
      
    //如果没有__toString方法,对象是不可以被输出的,只能被打印  
    //Catchable fatal error: Object of class Person could not be converted to string  
    //类Person对象不能转换为字符串   
    //print_r($class);  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值