PHP5 的对象新增了一个专用方法 __call()这個方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在或被权限控制中的方法__call 方法将会被自动调用。
都是在特定的作用域中调用函数等于设置函数体内this对象的值,以扩充函数赖以运行的作用域
一般来说,this总是指向调用某个方法的对象但是使用call()和apply()方法时,就会改变this的指向
call()方法使用示例:
说明: call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象如果没有提供thisObj参數,那么Global对象被用于thisObj
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参數是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply ,
细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第②个参数是一个数组集合, 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就昰apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:
这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这個方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去
也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参數列表的集合.
通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:
一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通過apply的方式巧妙地解决这个问题!