`
wangyalei
  • 浏览: 53962 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

    博客分类:
  • 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 )

 

 

分享到:
评论
2 楼 phpgood 2010-09-01  
期待你分享更多的学习笔记!
1 楼 phpgood 2010-09-01  
好!

相关推荐

    一个自己学习总结的php类学习笔记

    例如,如果我们希望`$name`属性在类外部不可直接访问,可以将其设为`private`,并使用`__get()`和`__set()`魔术方法来间接访问: ```php Class Person { private $name; function __get($name) { if ($name == '...

    php个人学习笔记

    以上只是PHP学习笔记中的一部分内容,实际上PHP还有许多高级特性,如错误日志、命名空间、 Traits、魔术方法等。通过深入学习和实践,你可以掌握PHP并利用它构建复杂的Web应用程序。这份笔记旨在为初学者提供一个...

    php100教程学习笔记及面试题

    这部分内容还可能涵盖命名空间、魔术方法、反射、以及PHP的内置对象模型如PDO用于数据库操作,以及Session和Cookie的使用,这些都是PHP开发中不可或缺的部分。 然后,《PHP100教程96~112讲.docx》可能会讨论更高级...

    php100关于类的学习笔记

    2. **`__get()`和`__set()`**:这两个魔术方法允许开发者为类提供动态属性访问。`__get()`方法在尝试访问不存在的公共或受保护属性时被调用,而`__set()`则在尝试设置此类属性时被调用。 - **示例**:在`MyPc`类中...

    PHP学习笔记

    【PHP学习笔记】是一份全面的教程资源,旨在帮助初学者快速掌握PHP编程语言的基础和进阶知识。这份笔记包含了从基本语法到高级特性的详细讲解,是学习PHP的理想起点。 1. **PHP基础语法**(01_PHP语法.doc):这...

    PHP设计模式大全 学习笔记

    魔术方法是PHP中以两个下划线`__`开头的特殊方法,它们会在特定条件下自动调用。例如,`__construct()`用于对象初始化,`__destruct()`在对象销毁前执行,`__get()`和`__set()`处理未定义的属性读写,`__call()`和`...

    PHP从入门到精通完整笔记

    HTML+CSS笔记部分是PHP学习的前置知识,因为PHP常常用于动态生成网页。这部分会介绍HTML的结构元素,如标签、段落、标题,以及CSS的样式规则,如选择器、属性和值,如何实现页面布局和美化。理解HTML和CSS能帮助...

    PHP学习笔记 用户注册模块用户类以及验证码类

    3. **魔术方法**:`__get()`和`__set()`是PHP的魔术方法,用于访问和修改对象的私有属性。`__get()`返回指定字段的值,而`__set()`则设置字段的值。 4. **静态方法**: - `validateUsername()`:这是一个静态方法...

    Laravel 5 学习笔记

    ### Laravel 5 学习笔记知识点汇总 #### 环境配置与初始化 - **环境配置**:在开始使用 Laravel 5 前,需要确保系统安装了 PHP、Composer 和其他必要的开发工具。 - **`.env` 文件**:这是一个包含应用配置参数的...

    php5教程-实战源码笔记

    7. **PHP5的内置函数和新特性**:第十四章可能涵盖了PHP5的新特性,比如析构函数、魔术方法、类型提示、数组对象等。析构函数在对象销毁时自动执行,魔术方法如`__get`和`__set`提供了动态属性访问的便利。数组对象...

    php学习笔记 面向对象的构造与析构方法

    构造方法的定义,方法名是一个固定的, * 在php4中:和类名相同的方法就是构造方法 * 在php5中:构造方法选择使用 魔术方法__construct() 所有类中声明构造方法都使用这个名称 * 优点:在改变类名时,构造方法不用改变...

    韩顺平PHP从入门到精通笔记

    笔记将详细阐述MySQL数据库的使用,包括SQL语言的基本操作(如SELECT、INSERT、UPDATE、DELETE),以及如何使用PHP连接和操作MySQL数据库,如PDO(PHP Data Objects)或mysqli扩展的使用方法。 在高级主题中,笔记...

    韩顺平PHP(全149讲)课堂笔记

    7. **PHP魔术方法**:理解__construct、__destruct、__get、__set等魔术方法的作用和使用场景。 【PHP高级篇】 1. **PHP性能优化**:讨论PHP性能瓶颈及优化策略,如缓存技术、代码优化等。 2. **PHP框架**:如...

    韩顺平php入门到精通笔记

    数组则用于存储多个值,笔记将涵盖索引数组、关联数组以及多维数组的使用方法。 3. 文件与目录操作:PHP能方便地进行文件I/O操作,如读取、写入、复制、删除等。笔记会详细介绍文件处理函数,如fopen/fwrite/fclose...

    PDO---PHP数据对象(数据抽象层) 学习笔记

    PHP的**重载(Overloading)**是指当尝试访问不存在或权限不足的属性或方法时,会触发魔术方法,如`__get()`和`__call()`。这些方法允许在运行时动态处理类的属性和方法。 **序列化(Serialization)**和**反序列化...

    我的php学习笔记(毕业设计)

    总体来说,本篇PHP学习笔记包含了PHP的基本语法、面向对象编程的高级特性、设计模式的实际应用以及数据的序列化与反序列化等内容,这些内容是构建PHP应用程序时不可或缺的部分。对于想要学习PHP或者加深对PHP理解的...

    PHP基础笔记pdf

    3. **脚本标记**:`&lt;script language="php"&gt;php代码&lt;/script&gt;`,这是一种较为老式的标记方法,不推荐使用。 4. **标准标记**:`&lt;?php php代码 ?&gt;`,这是最常用的标记方式。 5. **XML风格**:`&lt;? php php代码 ?&gt;`,...

Global site tag (gtag.js) - Google Analytics