php中的魔术方法

__construct、__destruct

__construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称

   class Person
   {                                  
       public $name ;   
       public $age ;   
       public $sex ;   
                                  
     /**
      * 显示声明一个构造方法且带参数
      */                                           
     public function __construct( $name = "" , $sex = "男" , $age =22)
     {  
       $this ->name = $name ;
       $this ->sex = $sex ;
       $this ->age = $age ;
     }
     
     /**
      * say 方法
      */
     public function say()
     {
       echo "我叫:" . $this ->name . ",性别:" . $this ->sex . ",年龄:" . $this ->age;
    
                                               
   }
定义构造函数的时候,通过__construct方法自己对类的属性进行自动的初始化,这样不管类名怎么更改,类属性的初始化都
能不受影响。
需要注意的是

1、在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。

2、构造方法名称是以两个下画线开始的__construct()


__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.
析构函数允许你在使用一个对象之后执行任意代码来清除内存.
当PHP决定你的脚本不再与对象相关时,析构函数将被调用.
在一个函数的命名空间内,这会发生在函数return的时候.
对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋

值勤为NULL或者调用unset.

<?php
class Person{  
                             
   public $name ;    
   public $age ;    
   public $sex ;    
                                   
   public function __construct( $name = "" , $sex = "男" , $age =22)
  
     $this ->name = $name ;
     $this ->sex = $sex ;
     $this ->age = $age ;
   }
   
   /**
    * say 说话方法
    */
   public function say()
   {
     echo "我叫:" . $this ->name. ",性别:" . $this ->sex. ",年龄:" . $this ->age;
  
   
   /**
    * 声明一个析构方法
    */
   public function __destruct()
   {
       echo "我觉得我还可以再抢救一下,我的名字叫" . $this ->name;
   }
}
 
$Person = new Person( "小明" );
unset( $Person ); //销毁上面创建的对象$Person




__destruct 析构方法,能够销毁之前创建的对象,释放内存,同时能够重新定义属性。

2  __call() 方法的作用

为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。

该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

<?php
class Person
{              
   function say()
   {
                
       echo "Hello, world!<br>" ;
   }  
     
   /**
    * 声明此方法用来处理调用对象中不存在的方法
    */
   function __call( $funName , $arguments )
   {
      echo "你所调用的函数:" . $funName . "(参数:" ; // 输出调用不存在的方法名
      print_r( $arguments ); // 输出调用不存在的方法时的参数列表
      echo ")不存在!<br>\n" ; // 结束换行          
   }                    
}
$Person = new Person();     
$Person ->run( "teacher" ); // 调用对象中不存在的方法,则自动调用了对象中的__call()方法
$Person ->eat( "小明" , "苹果" );      
$Person ->say();

__call()方法,能够自己生成构造为定义的方法。












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值