php魔术方法__call

__call是魔术方法中的一个,当程序调用到当前类中未声明或没权限调用的方法时,就会调用__call方法

class test
{
  public function emptyFunc(){

    $getArgs = func_get_args();
    $funcName = $getArgs[0];
    //$params = array_slice($getArgs, 1);
    //var_dump($params);  // this is params                
    return $funcName . ‘ function is not exists‘;
  }

  public function __call($m, $params)
  {
     $arr[] = $m;
     $arr = array_merge($arr, $params);
     return call_user_func_array(array($this, ‘emptyFunc‘), $arr);
  }

  protected function nowToTest(){

    return ‘this is nowToTest‘;
  }
}

$testObj = new test();
var_dump($testObj->nowToTest(‘params1‘,‘params1‘));
//var_dump result => string(29) "nowToTest function is not exists"

如上test类中,nowToTest方法是存在的,但修饰这方法的是protected(保护),所以实例出来的对象没权限执行,这时就跑到__call中去了.

_call()有2个参数,第一个$m是当前调用方法的名字,这里是‘nowToTest‘,第二个$params是调用‘nowToTest‘方法时传入的参数。以数组的形式组合在$params中。

call_user_func_array($method, $params)这个php方法的作用是调用 $method方法,参数为$params,如果方法是在类中的话,就用上面那种数组形式调用就可以了,这里调用的是emptyFunc方法。 func_get_args()的作用是以数组形式获取传入的所有参数。而这些参数在__call中传入的,第一个参数就是方法名。所以最后返回的结果是

"nowToTest function is not exists"
时间: 2024-10-24 09:26:27

php魔术方法__call的相关文章

巧妙的重载魔术方法__call()

工作半年了,感觉这半年学到的东西比大学四年学到的还要多,主要原因是心静下来了,目标也明确了,不会去整天的和游戏纠缠在一起了.大学时候其实也意识到了玩游戏会影响自己的正常学习和工作的,但是一直控制不了自己,还是忍不住经常去玩,没日没夜的玩(本来就是闷骚男,还宅着玩游戏,这也是大学四年只有游戏.左右手,没有女朋友的一个原因了).现在工作了,每天都有任务,看到旁边的牛人们在项目中如鱼得水,就有了赶超他们的想法,于是每天都会给自己一个额外的小任务去学习新的知识,到现在工作有半年了,对以前不熟悉的linu

phpz中的魔术方法__call、__set、__get、__sleep、__invoke、__autoload、__construct、__destruct、__clone、__tostring、__callstatic

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象. class testClass { public function __invoke { print “hello world”; } } $n = new testClass; $n(); 执行结果为: hello world. 官方示例 class CallableClass { public function __invoke($x) { var_dump($x); } } $obj = new C

关于PHP魔术方法__call的一点小发现

好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方法会在特定情况下被触发,我们也可以对其进行重写. ---------------------------------------------------------------------------------------------------------摘抄开始----------------

php中的魔术方法__call(),__clone(),__set(),__get()

__call($a,$v),当在类外部调用类中不存在或者不可见(用protected,private修饰)的方法时,会自动调用__call(方法名,数组参数),此时会向改方法传递2个参数,第一个为调用的方法名,第二个为传递的参数放进数组里.__clone()方法在类的对象被克隆时触发.__set($key,$val)在类外部设置类中不存在或者不可见(protected,private修饰)的属性时触发该方法,此时传递2个参数,第一个是属性名,第二个是属性值.__get($key)在类外部获取类中

魔术方法__clone(), __toString(), __call(), __autoload(), __sleep()和__wakeup()详解

一.魔术方法__clone() <?php class demo{ public $name; public $age; public function __construct($name,$age){ $this -> name = $name; $this -> age = $age; } public function say(){ echo "say".$this->name; } //在克隆对象时自动调用 //作用:可以对新对象的成员属性进行赋值 pu

PHP魔术方法之__call与__callStatic方法

//魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ class Human { private function t(){ } public function __call($method,$arg){ echo '你想调用我不存在的方法',$method,'方法<br/>'; echo '还传了一个参数<br/>'; echo print_r($arg),'<br/>'; } public static function _

PHP常用魔术方法(__call魔术方法:)

魔术方法  __call <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload_register('\\IMooc\\Loader::autoload'); $Object = new \IMooc\Object(); echo $Object->test("哎哟喂",123);//在调用test不存在的方法时,会自动调用__call方法 /*输出: stri

魔术方法之__call与__callStatic方法

<?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @param string $arg 获得方法的参数集合 */ public function __call($method, $params){ echo '你想调用我不存在的方法', $method, '方法'; echo '还传了一个参数'; print_r($params); } //魔术方法__cal

PHP魔术方法和魔法变量详解

一.魔术常量 __LINE__ 文件中的当前行号.__FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名. 自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径), 而在此之前的版本有时会包含一个相对路径.__DIR__ 文件所在的目录.如果用在被包括文件中,则返回被包括的文件所在的目录. 它等价于 dirname(__FILE__).除非是根目录,否则目录中名不包括末尾的斜杠.__FUNCTION__ 函数名称(