`
天梯梦
  • 浏览: 13732921 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

__call、__set 和 __get的用法

PHP 
阅读更多

1. __call的用法

 

PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。

 

例:__call

<?php
class foo {
	function __call($name,$arguments) {
		print("Did you call me? I'm $name!<br>");
		print_r($arguments);
		print("<br><br>");
	}

	function doSecond($arguments)
	{
		print("Right, $arguments!<br>");
	}
} 
 
$test = new foo();
$test->doFirst('no this function');
$test->doSecond('this function exist');
?>

 

2. __call 实现“过载”动作

 

 这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。

 

例:使用 __call 实现“过载”动作

<?php
class Magic {
	function __call($name,$arguments) {
		if($name=='foo') {
			if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
			if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
		}
	}   
	
	private function foo_for_int($x) {
		print("oh an int!");
	}   
		
	private function foo_for_string($x) {
		print("oh a string!");
	}
} 

$test = new Magic();
$test->foo(3);
$test->foo("3");
?>

 

3.  面向对象重载

<?php
/*__call(string $name,array $arg)的用法
*当调用一个不可访问的方法的时候调用$name是方法名称 $arg是个数组包含要传递给方法的参数
*/
class Account{
	private $user=1;
	private $pwd=2;
	public function __call($name,$arg){
		switch(count($arg)){
			case 2:
				echo $arg[0]*$arg[1],PHP_EOL;
				break;
			case 3:
				echo array_sum($arg),PHP_EOL;
				break;
			default:
				echo "参数不对",PHP_EOL;
				break;
		}
	}

}
	$a= new Account();
	//这里模拟了重载
	//重载:一个类中可以定义参数列表不同但名字相同的多个方法
	$a->make(5);
	$a->make(5,6);

 

4. 使用__call()方法来实现数据库连贯操作

<?php
  // 使用__call()方法来实现数据库连贯操作
 // 申明一个Db类(数据库操作类)的简单操作模型

class Db{
    private $sql = array(
        "field" => "",
        "where" => "",
        "order" => "",
        "limit" => "",
        "group" => "",
        "having" => "",
    );
   
    // 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句
    function __call($methodName,$args){
        // 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称
        $methodName = strtolower($methodName);
       
        // 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素
        if(array_key_exists($methodName,$this->sql)){
            $this->sql[$methodName] = $args[0];
        }else{
            echo '调用类'.get_class($this).'中的方法'.$methodName.'()不存在';
        }
        // 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作
        return $this;
    }
    // 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法
    function select(){
        echo "SELECT {$this->sql['field']} FROM  user {$this->sql['where']} {$this->sql['order']} {$this->sql['limit']} {$this->sql['group']}
                {$this->sql['having']}";
    }
}

$db = new Db();

// 连贯操作
$db->field('sex, count(sex)')
   ->where('where sex in ("男","女")')
   ->group('group by sex')
   ->having('having avg(age) > 25')
   ->select();
?>

 

5.  __set 和 __get的用法

 

这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。

 

例: __set 和 __get

<?php
class foo {
	function __set($name,$val) {
		print("Hello, you tried to put $val in $name<br>");
	}
 
	function __get($name) {
		print("Hey you asked for $name<br>");
	}
}

$test = new foo();
$test->__set('name','justcoding');
$test->__get('name');
?>

 

分享到:
评论

相关推荐

    ALV EDIT_MASK字段的使用.rar_ABAP EDIT_MASK_ALV EDIT_MASK字段的使用_ALVEDIT

    这通常通过在`CALL REPORT`或`CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'`等语句中使用`SET_EDIT_MASK`方法来实现。例如: ``` DATA: ls_edit_mask TYPE lvc_s_fdef, lv_fieldname LIKE LINE OF it_fieldname. ls...

    Python __setattr__、 __getattr__、 __delattr__、__call__用法示例

    使用`getattr`来实现工厂模式 复制代码 代码如下: #一个模块支持html、text、xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出 import statsout def output(data, format=”text”)...

    JAVA动态对象装配实现 测试--初步实现bean的set/get功能

    在Java中,Bean通常是指符合JavaBeans规范的Java类,它们是可重用的组件,具有无参数的构造函数、`get`和`set`方法(用于访问属性)以及可以序列化的特性。JavaBeans允许开发者在运行时通过反射机制来创建、配置和...

    gdbus 最简单可用demo源码

    下面我们将深入探讨GDBus的关键概念和使用方法。 1. **连接到D-Bus总线**: GDBus提供`g_bus_get()`函数,用于连接到系统或会话总线。系统总线用于系统级服务,而会话总线适用于用户级别的应用程序通信。`G_BUS_...

    php使用get_class_methods()函数获取分类的方法

    - `__call()` 和 `__callStatic()`: 当尝试调用类中不存在的方法时,这两个魔术方法会被触发,允许进行动态方法调用。 - `__get()` 和 `__set()`: 用于处理未定义的属性访问。 - `__isset()` 和 `__unset()`: 检查...

    PHP使用方法重载实现动态创建属性的get和set方法

    这里我们将重点讲解如何使用`__call()`魔术方法来动态创建属性的get和set方法。 `__call()`是PHP的一个魔术方法,当尝试调用类中不存在的方法时,PHP会自动触发这个方法。`__call()`接收两个参数:$name,即尝试...

    全志A80平台固定以太网的MAC地址ethernet_a80_merrii_20151203_1607.7z

    全志A80的以太网使用固定MAC地址.txt 2015/12/3 16:09 开发板:美睿的商业开发板 OS:android4.4.2(美睿提供) linux:3.4.39 发现全志平台的A80的以太网的MAC地址是变化的,由于需要做MAC地址和IP绑定的问题。 ...

    DBUS-GLIB 说明文档

    DBUS-GLIB是DBUS消息总线系统的GLib绑定,它是一个...由于文档内容可能经过OCR扫描,可能导致某些文字识别错误或遗漏,开发者在使用过程中应当对照官方DBUS-GLIB的源码和文档进行核对,以确保正确理解各个组件和功能。

    php魔术函数__call()用法实例分析

    `__call()` 是这些魔术函数之一,它主要用于处理对象调用不存在的方法时的情况。当尝试通过一个对象调用一个类中未定义的方法时,PHP会自动触发 `__call()` 魔术函数。 以下是对 `__call()` 魔术函数的详细说明: ...

    exosip2开发手册

    在使用exosip时,首先需要做的任务是初始化exosip上下文以及libosip库(解析器和状态机)。这是使用exosip进行开发的基础步骤,必须确保这两部分都正确初始化,才能顺利进行后续操作。 **初始化步骤**: 1. **加载...

    Python中几种属性访问的区别与用法详解

    本文将深入探讨Python中几种属性访问方式的区别和用法,包括常规的点号访问、特殊方法`__getattr__`、`__getattribute__`、`__get__`以及`__getitem__`。 1. 常规属性访问: 当我们使用点号`.`来访问一个对象的...

    php教程之魔术方法的使用示例(php魔术函数)

    这两个方法与 `__set()` 和 `__get()` 类似,但处理的是不可访问的方法。`__call()` 在对象上下文中调用不存在的方法时触发,而 `__callStatic()` 在静态上下文中调用不存在的方法时触发。它们都可以接收方法名称 `...

    hpilo-python模块开发所用到的API接口列表

    在开发使用`hpilo-python`模块的过程中,开发者可以利用一系列的API接口来与HP的iLO(Integrated Lights-Out)管理接口进行交互,实现对远程服务器的监控和管理。以下是这些API接口的详细说明: 1. **activate_...

    gsoap http webapi

    本篇文章将深入探讨如何使用gSOAP通过HTTP GET和POST方法调用Web API接口,以实现高效的数据交换。 一、gSOAP简介 gSOAP是Peter van der Linden开发的一个工具集,用于生成C或C++代码,这些代码可以处理SOAP消息的...

    DBus_C_API_Lowlevel

    - **连接管理**:使用`dbus_bus_get()`获取到消息总线的连接,通常有SESSION和SYSTEM两种总线。 - **认证**:DBus支持多种安全认证机制,如ANONYMOUS、DBUS_COOKIE_SHA1等。 - **监听**:使用`dbus_connection_...

    SETRES

    标题“SETRES”所指的是一个命令行工具,用于在Windows操作系统中改变计算机的屏幕分辨率和刷新率。在批处理文件中使用SETRES,可以自动化这个过程,尤其在系统配置、测试或者无人值守的环境中非常实用。 批处理...

    OpenMP并行计算Fortran

    文档从OpenMP的基本概念入手,逐步深入到各种并行构造的使用方法,适合初学者作为入门教程,同时也为有经验的开发者提供了深入理解OpenMP的机会。 #### 二、OpenMP基本概念 OpenMP是一种高级编程模型,允许程序员...

    exoSip 开发者手册

    每个函数都有详细的文档说明,包括参数、返回值和用法示例,以帮助开发者正确理解和使用。 2.2.2 Functions 网络API中的函数如`eXosip_build_request`和`eXosip_send`用于构建和发送SIP消息,`eXosip_recv`用于...

    verilog hdl 电梯控制程序

    该系统主要由两个模块组成:目的地楼层记录模块(destination)和呼叫请求记录模块(call)。 ### 目的地楼层记录模块(Destination) 此模块用于记录用户指定的目的地楼层信息。该模块包含以下输入和输出信号: - **...

Global site tag (gtag.js) - Google Analytics