php -- 魔术方法 之 调用方法:__call()、__callStatic()

方法重载:当调用一个不存在或者权限不够的方法的时候,会自动调用__call()方法

public function __call($name,$args){}  :用对象调用方法

public static function __callStatic($name,$args){}: 用类调用静态方法

  $name:被调用的方法名

  $args:被调用的方法的参数列表数组

<?php

    //PHP方法重载
    class Person{
        //方法
        private function test(){
            echo __METHOD__;
        }

        protected static function test1(){
            echo __METHOD__;
        }

        //增加魔术方法
        //有两个参数:第一个是方法名,第二个是参数数组
        public function __call($name,$args){
            //var_dump($name);//方法名字
            //var_dump($args);//参数数组
            //定义允许访问列表
            $allow = array(‘test‘);

            if(in_array($name,$allow))
                $this->$name();                        //可变方法
            else return false;
        }

        //增加一个静态方法的访问
        public static function __callStatic($name,$args){
            $allow = array(‘test1‘);

            if(in_array($name,$allow))
                self::$name();                        //可变方法
            else return false;
        }
    }

    echo ‘<pre>‘;

    //实例化
    $person = new Person;

    //访问私有方法
    //没有魔术方法之前
    //$person->test();            //出错
    //Person::test1();            //出错

    $person->test();            //有了__call魔术方法,且允许访问
    var_dump($person->test2());    //false

    Person::test1();
时间: 2024-10-06 21:59:58

php -- 魔术方法 之 调用方法:__call()、__callStatic()的相关文章

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload 1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $proper

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_

【转】PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload 1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $proper

PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $value ) 给一个未定义的属性赋值时调用: 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性). 2.__isset.__unset __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法: _

MVC,如何在视图中申明方法,调用方法?

<div> <!--在视图中申明方法,此方法的类型已经固定为HelperResult--> @helper ShowHello(string s) { <div> 哇塞!!!@s </div> } </div> <div> <!--调用在视图中申明的方法--> @ShowHello("cfs") </div> 效果图: <div> <!--在视图中申明方法,此方法的类型已经

Swift 2.0特有的枚举函数的实现方法和调用方法

一. //枚举网络访问错误 //swift 中枚举可以定义函数和属性 private enum GFFNetworkError: Int { case emptyDataError = -1 case emptyTokenError = -2 //错误描述 private var errorDescription: String { switch self { case .emptyDataError: return "空数据" case .emptyTokenError:return

jQuery EasyUI相同的Tab只打开一个(暨jQuery EasyUI方法的调用方法)

function addTabA(title){ if ($('#tt').tabs('exists', title)){ $('#tt').tabs('select', title); } else { $('#tt').tabs('add',{ title:title, content:'Tab Body ' , iconCls:'icon-save', closable:true }); } } jQuery EasyUI的其他方法调用方式相似 例如:layout 默认收起 $('#lay

c# delegate 封装 方法的复用 方法里面调用方法

class Program { public delegate int Run(int i, int j); public static void Main(string[] args) { MainFunction(Add); MainFunction(Delete); MainFunction(Ride); MainFunction(Divide); } public static void MainFunction(Run r) { // do someThing r(10, 10); /

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手