10月8日作业
1. 实例演示四个属性重载的魔术方法的使用方式
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
3. 实例演示方法重载的实现原理与参数获取方式
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
属性重载魔术方法的使用 : __get(), __set(), __isset(), __unset()
<?php namespace moshu; //属性重载魔术方法的使用 __get(), __set(), __isset(), __unset() // 魔术方法: 不需要或不允许用户调用,由系统来调用, class Demo { public $age; private $name; //私有的属性 名字 private $salary; //私有的属性 工资 protected $secert = 'PHP中文网的朱老师和猪哥不是同一个人'; //受保护的属性 public function __construct($name, $salary) { $this->name = $name; $this->salary = $salary; } //__get()魔术方法是读操作,重载用户对属性的访问 public function __get($a) { return $this->$a; } //__set($name,$value)魔术方法,写操作 public function __set($name, $value) { return $this->$name = $value; } //__isset($name),__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。 public function __isset($name) { echo('我被调用了'); return isset($this->$name); } public function __unset($name) { echo('我被调用了删除操作'); unset($this->$name); //unset()方法没有返回值. } } $obj = new Demo('朱老师', 9999); echo $obj->name.'<br>'; echo $obj->salary.'<br>'; echo $obj->secert.'<br>'; //是私有属性,类外部不能直接访问,当使用__get();方法重载后,可以输出变量了 //设置$name为欧阳老师 $obj->name = '欧阳老师'; //如果没有用到__set()方法重载,会报错 //Fatal error: Uncaught Error: Cannot access private property moshu\Demo::$name echo $obj->name.'<br>'; echo isset($obj->obj)? '属性存在' : '属性不存在'; echo('<hr>'); echo empty($obj->secert)? '属性不存在' : '属性存在'; echo('<hr>'); //访问到了公共属性,__isset()不被调用 echo isset($obj->age)? '属性存在' : '属性不存在'; echo('<hr>'); unset($obj->name); echo($obj->name); //删除私有属性后,不能访问 //Notice: Undefined property: moshu\Demo::$name ?>
点击 "运行实例" 按钮查看在线实例
call_user_func_array()回调执行函数/对象/类的方法的流程与方式
<?php namespace func; function sum ($a, $b){ return "{$a} + {$b} = ".($a+$b).'<br>'; } //回调执行函数的方式 echo call_user_func('\func\sum',30,40); echo call_user_func(__NAMESPACE__.'\sum',10,20); echo call_user_func_array(__NAMESPACE__.'\sum',[30,50]); //回调执行对象\类的方法的方式 class Test { public function sum ($a, $b){ return "{$a} + {$b} = ".($a+$b).'<br>'; } public static function sum2 ($a, $b){ return "{$a} + {$b} = ".($a+$b).'<br>'; } } //实例化类 $obj = new Test(); echo call_user_func_array([$obj,'sum'],[30,60]); echo call_user_func_array([new Test(),'sum'],[30,60]); echo '<hr>'; //调用类里面的静态方法 echo call_user_func_array(__NAMESPACE__.'\Test::sum2',[40,60]); //::class , 返回一个带有命名空间的类名称 echo Test::class.'<br>'; //使用::class后面跟的是静态方法 echo call_user_func_array([Test::class,'sum2'],[50,60]); ?>
点击 "运行实例" 按钮查看在线实例
实例演示方法重载的实现原理与参数获取方式
<?php namespace func2; //方法重载 class Test2 { // __call(): 访问一个不存在或无权限访问的方法的时候会自动调用 //$name 方法名 //$args 参数数组 public function __call($name, $args){ return '调用的方法'.$name.'不存在<br>参数<pre>'.print_r($args,true); } //静态方法重载 public function __callStatic($name, $args){ return '调用的方法'.$name.'不存在<br>参数<pre>'.print_r($args,true); } } $obj = new Test2(); echo $obj->name('朱老师',29); echo '<hr>'; echo Test2::name('欧阳老师',18); ?>
点击 "运行实例" 按钮查看在线实例
数据库链接调用