php学习笔记(魔术方法的使用)

 

1 __construct().当实例一个对象时会先执行此方法,当子类实例化时会先执行父类的构造,这个没什么好说的和java,c#等oop语言一样。例如:

<?php

class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       print "In SubClass constructor\n";
   }
}

$obj = new BaseClass();
$obj = new SubClass();
//In BaseClass constructor In BaseClass constructor In SubClass constructor
?>

 

2.__destruct析构方法的概念和其他面向对象的语言(比如java(垃圾回收机制))是一样的。当指向这个对象的最后一个引用被销毁的时候,析构方法被调用,调用完成后释放内存。(先销毁父类在子类)注意:析构方法不接受任何参数。

<?php
class MyDestructableClass {
   function __construct() {
       print "In constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
//In constructor    Destroying MyDestructableClass
?>

 

3。__autoload()拦截函数在一个未声明的类被初始化的时候自动调用。该类的名字会被自动传递给__autoload()函数。而__autoload()也只有这么唯一的一个参数。

 

<?php
class ClassName{
  
   public function __construct(){
	echo "加载me";
   }
}
?>

 

<?php
function __autoload($className) {
   include_once $className . ".php";
}
$object = new ClassName();//加载me 
?>


 

4. __get传递属性的名字 并返回属性的值 __set 传递属性的名字 和新的值,两个是一般是一起使用的,不过与java中的getter setter有一点不一样,看例子

<?php
class StrictCoordinateClass{

	private $arr = array('x'=>NULL,'y'=>NULL);

	public function __get($property){

         echo "key--------------->".$property;
         echo "<br>";
		if(array_key_exists($property,$this->arr)){
			 return $this->arr[$property];
		}else{

			echo "没有找到这一个属性";
		}
	}


 public function __set($property,$value){
         echo "property------------------->".$property."<br>";

         echo "value---------------------->".$value."<br>";

		 if(array_key_exists($property,$this->arr)){
		 	$this->arr[$property] = $value;
		 }else{
		 	print "__set错误";
		 }
	}

}

	$obj = new StrictCoordinateClass();
                $obj->x = 1;//进行set 赋值
	echo $obj->x;//get方法取值
	echo "<br>";
	$obj->n = 2;
	print $obj->n;
//property------------------->x
//value---------------------->1
//key--------------->x
//1
//property------------------->n
//value---------------------->2
//__set错误key--------------->n
//没有找到这一个属性
?>

 

5..__call 有点像c#中的委托 传递方法的名字和一个数字索引数字 数组包含传递的参数 第一参数的索引0

 

<?php
class HelloWorld {
	function display($count) {

		for ($i = 0; $i < $count; $i++) {

			print "Hello world\n";
		}

		return $count;
	}

}

class HelloWorldDelegator {

	private $obj;

	function __construct() {

		$this->obj = new HelloWorld();

	}

	function __call($method, $args) {

		echo "method---------------->" . $method;
		echo "<br>";
		echo "args------------------>" . print_r($args, true);
		//call_user_func_array("回调函数(对象,方法)",数组参数)
		return call_user_func_array(array (
			$this->obj,
			$method
		), $args);
	}
}

$obj = new HelloWorldDelegator();
print $obj->display(3);
//method---------------->display
//args------------------>Array ( [0] => 3 ) Hello world Hello world Hello world 3
?>

 

总结:

//php能通过实现特殊的代理方法对属性的访问和方法的调用进行重载
//function __get($property);__get 传递属性的名字 并返回属性的值
//function __set($property,$value);//传递属性的名字 和新的值
//function __call($method,$args);//传递方法的名字和一个数字索引数字 数组包含传递的参数 第一参数的索引0
//__get __set是对成员属性来说  __call 是 对方法来说

 

<?php
/*
 * Created on 2010-8-26
 *
 * 魔术方法的使用
 *
 */
class Test {

   /*******
    * @param string 属性的名称
    */
	public function __get($key) {
		echo $key . " 不存在";
	}

    /*******
     * @param string 要赋值的成员变量名称
   * @param string 要赋的值
     */
	public function __set($key,$value){

		echo "对".$key."赋值".$value;
	}
	
	/******
	 * @param string 方法名
	 * @param array 参数列表
	 * */
	public function __call($key,$args){

		 echo "您要调用的 {$key} 方法不存在。你传入的参数是:" . print_r($args, true);

	}
}
$t = new Test();
echo $t->name;
echo "<br>";
$t->name = "aninggo";
echo "<br>";
$t->getName("asdf","go");
//name 不存在
//对name赋值aninggo
//您要调用的 getName 方法不存在。你传入的参数是:Array ( [0] => asdf [1] => go )

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值